对于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
不是值的属性。它是绑定的一个属性(我特别而不是谈论可变引用,即&mut
,仅let mut
(。
CCD_ 6表示";我不会试图直接或间接地改变v
包含的值到v
;。
但一旦它不再在v
中,即被移动,就可以更改它。
因此,以下代码编译成功:
let v = Foo { bar: String::new() };
let mut mutable_v = v;
mutable_v.bar = "abc".to_owned();
从我们将值移出v
的那一刻起,v
的可变性就不再相关了。
同样,从我们将值从f
移到向量strings
的那一刻起,f
的可变性就不再重要了,但strings
的可变性——因为我们不会通过f
而是通过strings
来改变值。