迭代切片的值而不是Rust中的引用?

时间:2016-11-15 15:30:36

标签: iterator rust

当循环遍历一个结构片段时,我得到的值是一个引用(很好),但在某些情况下,必须将var写为(*var),这很烦人。很多地方。

有没有更好的方法来避免重新声明变量?

fn my_fn(slice: &[MyStruct]) {
    for var in slice {
        let var = *var;  // <-- how to avoid this?

        // Without the line above, errors in comments occur:

        other_fn(var);  // <-- expected struct `MyStruct`, found reference

        if var != var.other {
            // ^^ trait `&MyStruct: std::cmp::PartialEq<MyStruct>>` not satisfied
            foo();
        }
    }
}

参见:actual error output(更神秘)。

2 个答案:

答案 0 :(得分:20)

您可以通过the pattern中的解构删除引用:

struct

然而,这仅适用于// | // v for &var in slice { other_fn(var); } - 类型的!如果您有非Copy但仅Copy的类型,则可以使用Clone迭代器适配器;有关更多信息,请参阅Chris Emerson的答案。如果您的类型不是cloned(),则您没有机会这样做。

答案 1 :(得分:8)

在某些情况下,如果可以使用迭代,则可以直接迭代值,例如使用Vec::into_iter()。使用切片,您可以使用cloned

fn main() {
    let v = vec![1, 2, 3];
    let slice = &v[..];
    for u in slice.iter().cloned() {
        let u: usize = u; // prove it's really usize, not &usize
        println!("{}", u);
    }
}

这显然依赖于可克隆的项目;但如果没有,你可能确实想要参考。