不会,因为切片不会保存此信息.我们所拥有的唯一信息是指向它的起点和长度的指针,而不是String
‘S的起点,因此我们不能知道它离那里有多远.
如果你有原始的字符串,你可以用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);
}
Playground.
请注意,此函数不会判断数据是否真的来自这String
,并且在这种情况下会默默地给出错误的结果.