You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中遍历可变借用Vec时编译报错,如何正确处理?

解决Rust中Vec同时可变/不可变借用的冲突问题

你的代码编译失败的核心原因是:vec.iter().enumerate()会创建一个持有不可变借用的迭代器,这个借用会持续整个循环周期;而循环内的vec[...]=...又尝试获取Vec的可变借用,违反了Rust的借用规则——同一时间不能存在可变借用和任何不可变借用。

不需要复制整个Vec,只需要调整遍历方式,避免同时持有两种借用即可,最直接的方案是通过索引遍历,先读取元素的副本(因为i32是Copy类型,开销可以忽略):

fn foo(vec: &mut Vec<i32>) {
    for i in 0..vec.len() {
        // 先读取当前索引的元素值副本,不持有Vec的引用
        let element = vec[i];
        // 这里可以添加你的检查逻辑
        vec[element as usize] = i as i32;
    }
}

fn main() {
    let mut bar: Vec<i32> = vec![1, 0, 2];
    foo(&mut bar);
}

为什么这个方案可行?

  • 每次循环中,vec[i]只是临时读取元素的值并复制到栈上,不会持有Vec的不可变引用;
  • 后续的vec[element as usize] = ...是独立的可变借用操作,执行完就释放,不会和其他借用产生冲突。

如果你的元素类型不是Copy,可以使用std::mem::replace或者先收集所有元素的所有权到临时集合中再遍历修改,但对于i32这类简单类型,直接复制是最简洁高效的方式。

内容的提问来源于stack exchange,提问作者gurkensaas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:50:31