Rust:从引用创建切片

Rust: Creating a slice from a reference

是否可以使用对该数组的引用来指定 start/end 而不是索引来创建数组的切片(或其他任何内容)?

例如,假设我正在遍历一个数组,当我到达某个元素时,我想调用一个函数,将数组的一部分从当前元素传递到末尾:

let list = [1, 2, 3, 4, 5, 6];
for item in &list {
   if passes_test(item) {
       process_remainder(&list[item..]); // does not compile
   }
}

来自 C 语言,这似乎是一件自然而然的事情 - 引用只是一个指针,而切片只是一对指针(或指针和长度),并且采用多个引用应该没问题,因为none 其中是可变的。但是我找不到正确的语法来做到这一点。

或者,是否可以获取给定引用的索引(如 C 中的指针算法),或者我是否只需要分解并在迭代时使用枚举生成索引和引用?

通常,enumerate优于指针算法。

fn main() {
    let list = [1i32, 2, 3, 4, 5, 6];
    for (index, item) in list.iter().enumerate() {
        if *item > 5 {
            process_remainder(&list[index..]);
        }
    }
}

(一不小心,你的代码 编译,因为数组项是 usize。:) 所以我将它们更改为 i32。)

你可以做到,但它既不安全也不漂亮:

let list = [1, 2, 3, 4, 5, 6];
for item in &list {
    if passes_test(item) {
        let idx = unsafe { (item as *const u64).offset_from(list.as_ptr()) as usize };
        process_remainder(&list[idx..]);
    }
}

使用 enumerate 是更好的选择:

let list = [1, 2, 3, 4, 5, 6];
for (i, item) in list.iter().enumerate() {
   if passes_test(item) {
       process_remainder(&list[i..]);
   }
}