为什么一个不可变的结构在移动到向量中时会变得可变



对于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来改变值。

最新更新