Rust:从引用创建切片

3

是否可以使用数组中的引用来指定开始/结束位置,从而创建数组(或其他任何内容)的切片?

例如,假设我正在遍历一个数组,并且当我到达某个元素时,我想调用一个函数,将当前元素到结尾的数组切片传递给该函数:

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

对于从C语言过来的开发者,这似乎是一件很自然的事情 - 引用只是一个指针,而切片只是一对指针(或指针和长度),并且获取多个引用应该没问题,因为它们都不可变。但是我找不到正确的语法来实现它。

或者,是否可以获得给定引用的索引(就像在C中使用指针算术一样),或者我只需要妥协并使用enumerate来生成迭代时的索引和引用?

2个回答

4
通常情况下,比起指针算术运算,更倾向于使用 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类型。


3
你可以这样做,但它既不安全也不美观:
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..]);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接