【问题标题】:Re-assignment of immutable variable that should be a mutable borrow in a loop重新分配应该是循环中可变借用的不可变变量
【发布时间】:2017-07-11 13:59:18
【问题描述】:

我正在尝试修改可变的sums: Vec<i64>,同时对其进行迭代。循环代码如下:

for (j, &mut sum) in sums.iter_mut().enumerate() {
    if !(j == i) {
        sum += n;
    }
}

这是我得到的错误:

error[E0384]: re-assignment of immutable variable `sum`
  --> mini_max_sum.rs:27:17
   |
25 |         for (j, &mut sum) in sums.iter_mut().enumerate() {
   |                      --- first assignment to `sum`
26 |             if !(j == i) {
27 |                 sum += n;
   |                 ^^^^^^^^ re-assignment of immutable variable

这对我来说似乎完全是神秘的。 Rust 允许我从sums 可变地借用sum,但编译器阻止我实际修改它。省略 .enumerate() 甚至不会改变生成的错误代码。

我想知道如何修复循环。

【问题讨论】:

标签: rust mutable


【解决方案1】:

我不知道您为什么决定将&mut 添加到循环变量的模式中,但这就是问题所在。您需要直接获取可变引用,然后在增加它时取消引用它:

fn main() {
    let mut sums = vec![1, 2, 3];
    let i = 0;
    let n = 0;

    for (j, sum) in sums.iter_mut().enumerate() {
        if j != i {
            *sum += n;
        }
    }
}

在模式中使用&mut,实际上是在解构变量并删除可变引用。如果你print the type of your sum variable,你会看到它是i64

【讨论】:

  • 我没听懂。 &mut sum 到底有什么问题?这对我来说似乎更有意义。即使我写了同样的错误。现在,当您只写sum 时,这使它成为不可变和复制的,对吗?我想要对对象的引用以便我可以修改它,所以我写了&mut sum。请解释为什么会出错?
  • @Nawaz 在模式中,匹配的结构被删除。例如,在Some(foo) 中,Some 包装器被删除,foo 绑定到内部的值。模式中的&&mut 也会发生同样的情况。
猜你喜欢
  • 2018-03-05
  • 2018-10-11
  • 2015-10-16
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2018-04-15
相关资源
最近更新 更多