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

Dav*_*lsh 4 rust

对 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 的属性它是绑定的一个属性(我具体不是在谈论可变引用,即&mutlet 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