假设我有一个
String
,我从中切了一片(&str
)。是否可以仅通过切片本身找出该切片的开始和结束位置?
示例:
let original_string = String:from("Hello, world!");
let slice: &str = &original_string[0..5];
let slice_indexes = slice.some_function(); // (usize, usize)
println!("{:?}", slice_indexes);
不,因为切片不保留此信息。我们拥有的唯一信息是指向其开头和长度的指针,而不是
String
的开头,因此我们无法知道它距那里有多远。
如果你有原始字符串,你可以用 O(1) 的复杂度来完成:
fn get_position(full: &str, part: &str) -> (usize, usize) {
let start = part.as_ptr() as usize - full.as_ptr() as usize;
let end = start + part.len();
(start, end)
}
fn main() {
let original_string = String::from("Hello, world!");
let slice: &str = &original_string[0..5];
let slice_indexes = get_position(&original_string, slice);
println!("{:?}", slice_indexes);
}
游乐场。