Rust 锈是如何从可变变为不变的?
我有以下代码:Rust 锈是如何从可变变为不变的?,rust,Rust,我有以下代码: fn main() { let mut vec1 = vec![1, 2, 3]; vec1.push(4); println!("{:?}", vec1); let vec2 = vec![1, 2, 3]; vec2.push(4); println!("{:?}", vec2); } 我已经创建了两个向量,一个是可变的,另一个是不可变的。当我试图编译代码时,编译器会抱怨: error[E0596]: cannot borr
fn main() {
let mut vec1 = vec![1, 2, 3];
vec1.push(4);
println!("{:?}", vec1);
let vec2 = vec![1, 2, 3];
vec2.push(4);
println!("{:?}", vec2);
}
我已经创建了两个向量,一个是可变的,另一个是不可变的。当我试图编译代码时,编译器会抱怨:
error[E0596]: cannot borrow `vec2` as mutable, as it is not declared as mutable
--> src/main.rs:7:5
|
6 | let vec2 = vec![1, 2, 3];
| ---- help: consider changing this to be mutable: `mut vec2`
7 | vec2.push(4);
| ^^^^ cannot borrow as mutable
这很清楚,为什么会发生错误,因为vec2
是不可变的
让我们来看看vec代码>宏实现:
macro_rules! vec {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}
temp_vec
变量定义为可变的。当我创建一个向量
let vec2 = vec![1, 2, 3];
那么为什么vec2
也不可变呢?我解释为:
let vec2 = temp_vec
所以它是变量阴影不是这样。这表明可变性不是值类型的属性,而是其绑定的属性。在您的例子中,这意味着绑定/变量vec2是不可变的(因为您没有将其标记为可变性)。在宏内部,绑定/变量temp_vec是可变的。两者都只是“Vec”类型,没有“可变Vec”或“不可变Vec”类型。