rust - 为什么不可变结构在移入向量时会变为可变结构?

对 Rust 还是个新手,我正在学习该语言的可变性规则。我试图了解结构、对象、数组是否深度不可变。

所以我有这个结构

struct Foo {
    bar: String,
}

我想看看深度可变性的规则是什么。创建结构时,必须将结构定义为 mut 才能更改其属性。

let mut f = Foo{ 
    bar: String::from("hello") 
};

f.bar = String::from("foo"); // Must be mut to change a property
println!("{:?}", f.bar);

但是,当我定义一个不可变结构并将其移动到可变向量中时,该结构变为可变。

let f = Foo{ 
    bar: String::from("hello") 
};

let mut strings: Vec<Foo> = vec![f];

strings[0].bar = String::from("foo");

println!("{:?}", strings[0].bar);

我猜测 f 正在被复制到可变向量中(并从它的范围中删除?)并且副本被重新分配为可变但我不太确定。

我能否深入了解正在发生的事情?

最佳答案

mut 不是值的属性。它是绑定(bind)的一个属性(我特别不是谈论可变引用,即&mut,只是让mut).

let v 表示“我不会尝试通过 v 直接更改 v 包含的值 或间接”。

但是一旦它不再在 v 中,即它被移动了,就可以更改它。

因此,以下代码编译成功:

let v = Foo { bar: String::new() };
let mut mutable_v = v;
mutable_v.bar = "abc".to_owned();

从我们将值移出 v 的那一刻起,v 的可变性就不再相关了。

以同样的方式,从我们将值从 f 移到 vec strings 的那一刻起,f 的可变性不再重要了,但是 strings 的可变性 - 因为我们不通过 f 而是通过 strings 更改值。

https://stackoverflow.com/questions/71730828/

相关文章:

python - 列表的字典变成元组的元组的字典

c++ - 奇怪的 std::list 迭代行为

ruby-on-rails-7 - 如何在Rails7中使用importmap固定npm、yarn包

css - TailwindCSS : is it possible to remove a box

r - 通过匹配列和值 R 对数据帧进行子集和分组

python - 如何将变量插入文件路径?

html - Font-Awesome 版本 6 图标未显示

r - 将一列拆分为两列 : dataframes within a list

css - 在 RMarkdown 中,如何以 block 的形式获取 css 文件?

json - 在 Rust 中使用可选的 JSON 字段,避免在 JSON 中使用 None/nul