考虑下面的片段:

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().

我肯定错过了一些显而易见的东西.按值从基元类型引用复制的惯用方法是什么?

推荐答案

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

但是,基本类型(实际上,任何实现了Copy trait的类型)都会在取消引用时被复制,所以您只需要这样:

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,你不需要手动go 引用它.

Rust相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

收集RangeInclusive T到Vec T<><>

关于Rust 中回归的逻辑

在没有引用计数或互斥锁的情况下,可以从Rust回调函数内的封闭作用域访问变量吗?

在泛型 struct 的字段声明中访问关联的Conant

Arrow RecordBatch as Polars DataFrame

如何导出 rust 色二进制文件中的符号

为什么Rust函数的移植速度比C++慢2倍?

通过RabbitMQ取消铁 rust 中长时间运行的人造丝任务的策略

为什么Option类型try块需要类型注释?

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

如何保存指向持有引用数据的指针?

Rust:`sort_by` 多个条件,冗长的模式匹配

当你删除一个存在于堆栈中的值时,为什么 rust 不会抱怨

为什么 File::read_to_end 缓冲区容量越大越慢?

为什么具有 Vec 变体的枚举没有内存开销?

为实现特征的所有类型实现显示

Rust - 在线程之间不安全地共享没有互斥量的可变数据

为什么 Rust 标准库同时为 Thing 和 &Thing 实现特征?

有什么办法可以用 Rust 访问 Windows 最近的文件夹吗?