通过值从原始类型引用复制的惯用方法是什么?

时间:2014-09-05 10:52:39

标签: rust

请考虑以下代码段:

fn example(current_items: Vec<usize>, mut all_items: Vec<i32>) {
    for i in current_items.iter() {
        let mut result = all_items.get_mut(i);
    }
}

编译器抱怨i而不是&mut usize而不是usize

error[E0277]: the trait bound `&usize: std::slice::SliceIndex<[()]>` is not satisfied
 --> src/lib.rs:3:36
  |
3 |         let mut result = all_items.get_mut(i);
  |                                    ^^^^^^^ slice indices are of type `usize` or ranges of `usize`
  |
  = help: the trait `std::slice::SliceIndex<[()]>` is not implemented for `&usize`

我已经挖掘了文档,但我认为满足编译器的唯一方法是i.clone()

我肯定错过了一些明显的东西。从值原始类型引用复制的惯用方法是什么?

3 个答案:

答案 0 :(得分:7)

  

通过值从原始类型引用复制的惯用方法是什么?

您需要使用*取消引用引用。

let my_usize: usize = 5;
let ref_to_my_usize: &usize = &my_usize;
let copy_of_my_usize: usize = *ref_to_my_usize;

您也可以直接在循环中取消引用:

for &x in myvec.iter() {
//  ^-- note the &
}

答案 1 :(得分:6)

iter()上的{p> Vec<T>返回一个实现Iterator<&T>的迭代器,也就是说,这个迭代器将产生对向量的引用。这是最常见的行为,可以方便地使用不可复制的类型。

然而,原始类型(实际上,任何实现Copy特征的类型)都会在取消引用时被复制,所以你只需要这样:

for i in current_items.iter() {
    let mut result = all_items.get_mut(*i);
}

或者,您可以使用参考解构模式:

for &i in current_items.iter() {
    let mut result = all_items.get_mut(i);
}

现在i自动为usize,您无需手动解除引用。

答案 2 :(得分:1)

如果您需要iter参考,请不要使用&mut。请改用iter_mut