Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 锈是如何从可变变为不变的?_Rust - Fatal编程技术网

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”类型。