vector - 嵌套数据结构的 Rust 可变性

标签 vector rust mutable

谁能解释为什么下面的代码会编译,但如果我注释掉一行,那么它不会,即使代码本质上在做同样的事情?

struct OtherStruct {
  x: i32,
}

struct Inner {
  blah: i32,
  vector: Vec<OtherStruct>
}

struct Outer {
  inner: Inner,
}

impl Inner {
  pub fn set_blah(&mut self, new_val : i32) {
    self.blah = new_val;
  }
}

fn main() {
  let mut outer = Outer {
    inner: Inner {
      blah: 10,
      vector: vec![
        OtherStruct { x: 1 },
        OtherStruct { x: 2 },
        OtherStruct { x: 3 },
        OtherStruct { x: 4 },
        OtherStruct { x: 5 },
      ]
    }
  };

  for item in outer.inner.vector.iter() {
    println!("{}", item.x);
    outer.inner.blah = 4;
    //outer.inner.set_blah(6);
  }

}
编译器错误是:
   |
34 |   for item in outer.inner.vector.iter() {
   |               -------------------------
   |               |
   |               immutable borrow occurs here
   |               immutable borrow later used here
...
37 |     outer.inner.set_blah(6);
   |     ^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
这对我来说很有意义,我想我想知道为什么当我不使用函数调用时我可以逃脱它,肯定会出现相同的可变性问题吗?

最佳答案

set_blah需要借整个Inner结构对象。分配给 blah只需要借用字段本身,因为它还没有被借用,所以有效。

关于vector - 嵌套数据结构的 Rust 可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63771543/

相关文章:

c++ - 是否需要将 delete 用于在 vector 中创建的新数组?

rust - 类型 `&[u8]` 不能被 `usize` 索引?

rust - 在 &mut self 方法中展开成员变量时无法移出借用的内容

Swift struct 相当于 C++ 可变关键字?

python - "is"Python 运算符是否可以可靠地测试可变对象的引用相等性?

r - 在 R 中将向量乘以矩阵应该返回向量

c++ - 如何在 invokeMethod 函数中将列表、 vector 或数组作为参数传递

r - 汇总大量向量;按行或按元素,但忽略NA值

rust - 如何在 Hyper 处理程序之间共享 HashMap?

reference - 函数参数如何允许突变变量但不能指向任何其他变量?