对 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/