请考虑以下代码段:
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()
。
我肯定错过了一些明显的东西。从值原始类型引用复制的惯用方法是什么?
答案 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
。