请考虑以下代码段:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨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`
Run Code Online (Sandbox Code Playgroud)
我已经挖掘了文档但是我认为满足编译器的唯一方法是i.clone().
我肯定错过了一些明显的东西.从值原始类型引用复制的惯用方法是什么?
从值原始类型引用复制的惯用方法是什么?
您需要使用*取消引用引用.
let my_usize: usize = 5;
let ref_to_my_usize: &usize = &my_usize;
let copy_of_my_usize: usize = *ref_to_my_usize;
Run Code Online (Sandbox Code Playgroud)
您也可以直接在循环中取消引用:
for &x in myvec.iter() {
// ^-- note the &
}
Run Code Online (Sandbox Code Playgroud)
iter()on Vec<T>返回一个迭代器实现Iterator<&T>,也就是说,这个迭代器将产生对向量的引用.这是最常用的行为,可以方便地使用不可复制的类型.
但是,原始类型(实际上,任何实现Copy特征的类型)都会在取消引用时被复制,所以你只需要这样:
for i in current_items.iter() {
let mut result = all_items.get_mut(*i);
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用参考解构模式:
for &i in current_items.iter() {
let mut result = all_items.get_mut(i);
}
Run Code Online (Sandbox Code Playgroud)
现在i是usize自动的,您不需要手动取消引用它.
| 归档时间: |
|
| 查看次数: |
3091 次 |
| 最近记录: |