获取与父字符串相关的 &str 的原始切片

Get original slices of &str in relation to parent String

提问人:Miodek 提问时间:11/5/2023 更新时间:11/5/2023 访问量:57

问:

假设我有一个 ,我从中取出一个切片 ()。是否有可能仅通过切片本身来找出该切片的开始和结束位置?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);
字符串

评论


答:

3赞 Chayim Friedman 11/5/2023 #1

否,因为切片不保留此信息。我们拥有的唯一信息是指向其开头和长度的指针,而不是 的开头,因此我们无法知道它离那里有多远。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);
}

游乐场

请注意,此函数不会检查数据是否真的来源于此,并且在这种情况下会默默地给出错误的结果。String

评论

0赞 Miodek 11/5/2023
这样就可以了,谢谢