对 Rust 来说还是个新手,我正在学习该语言的可变性规则。我试图了解结构、对象、数组是否是深度不可变的。
所以我有这个结构
struct Foo {
bar: String,
}
Run Code Online (Sandbox Code Playgroud)
我想看看深度可变性的规则是什么。创建结构体时,必须定义该结构体,mut以便更改其属性。
let mut f = Foo{
bar: String::from("hello")
};
f.bar = String::from("foo"); // Must be mut to change a property
println!("{:?}", f.bar);
Run Code Online (Sandbox Code Playgroud)
然而,当我定义一个不可变的结构并将其移动到一个可变的向量中时,该结构就变得可变了。
let f = Foo{
bar: String::from("hello")
};
let mut strings: Vec<Foo> = vec![f];
strings[0].bar = String::from("foo");
println!("{:?}", strings[0].bar);
Run Code Online (Sandbox Code Playgroud)
我猜测它f被复制到可变向量中(并从其范围中删除?)并且副本被重新分配为可变的,但我不太确定。
我可以深入了解正在发生的事情吗?
Cha*_*man 12
mut不是 value 的属性。它是绑定的一个属性(我具体不是在谈论可变引用,即&mut仅let mut)。
let v意思是“我不会尝试直接或间接地改变通过v包含的值”。v
但是一旦它不再在 之内v,即它被移动,就可以更改它。
因此,以下代码可以成功编译:
let v = Foo { bar: String::new() };
let mut mutable_v = v;
mutable_v.bar = "abc".to_owned();
Run Code Online (Sandbox Code Playgroud)
从我们将值移出 的那一刻起v, 的可变性v就不再相关了。
以同样的方式,从我们将值移出f和移入 vec 的那一刻起strings, 的可变性f不再重要,而是strings- 的可变性,因为我们不是通过f而是通过更改值strings。