假设我有一个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‘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,并且在这种情况下会默默地给出错误的结果.

Rust相关问答推荐

使用pyo3::Types::PyIterator的无限内存使用量

为什么铁 rust S似乎有内在的易变性?

除了调用`waker.wake()`之外,我如何才能确保future 将再次被轮询?

有没有可能让泛型Rust T总是堆分配的?

使用关联类型重写时特征的实现冲突

为什么`tokio::main`可以直接使用而不需要任何导入?

Rust 中的静态引用

如何处理闭包中的生命周期以及作为参数和返回类型的闭包?

将 &str 或 String 保存在变量中

在 Rust 中忽略 None 值的正确样式

在发布中包含 Rust DLL

从Rust 的临时文件中创建引用是什么意思?

使用在功能标志后面导入的类型,即使未启用功能标志

从 HashMap>, _> 中删除的生命周期问题

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

Rust:如果我知道只有一个实例,那么将可变borrow 转换为指针并返回(以安抚borrow 判断器)是否安全?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

当引用不再被borrow 时,Rust 不会得到它

在特征中返回一个 Self 类型的值