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

问题描述 投票:0回答:1

假设我有一个

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 rust slice
1个回答
0
投票

不,因为切片不保留此信息。我们拥有的唯一信息是指向其开头和长度的指针,而不是

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);
}

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.