为什么当借用的变量发生变化时,借用的变量不会改变?

Jon*_*hej 2 rust

我是 Rust 新手,并试图了解借用原理。

我有以下代码:

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let largest_nbr = &number_list[0];

    println!("The largest number is {}", largest_nbr);

    let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];

    println!("The largest number is {}", largest_nbr);
}
Run Code Online (Sandbox Code Playgroud)

当我执行时cargo run我得到这个结果:

> The largest number is 34
> The largest number is 34
Run Code Online (Sandbox Code Playgroud)

我预计第二行会说102是最大的数字,因为largest_nbr借用自number_list,因此指针显示在 的存储处number_list。当 的值number_list改变时, 的值不应该largest_nbr也改变吗?

Fin*_*nis 8

该行:

let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];
Run Code Online (Sandbox Code Playgroud)

修改原始number_list变量。它创建一个新名称并以相同的名称命名,从而遮盖原始名称。

简单来说,这意味着现在number_list存在两个变量,但第一个变量不再可访问,因为第二个变量已接管名称。然而,该largest_nbr变量引用第一个变量。

请注意,您在这里尝试的操作是不可能的,因为在借用数组的一部分时您无法修改该数组。let我想这就是为什么你在其中添加了 a ,因为如果你只是简单地写number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8],而没有let,你会得到一个错误,告诉你在 中借用它时你不能修改它largest_nbr

看:

fn main() {
    let mut number_list = vec![34, 50, 25, 100, 65];

    let largest_nbr = &number_list[0];

    println!("The largest number is {}", largest_nbr);

    number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];

    println!("The largest number is {}", largest_nbr);
}
Run Code Online (Sandbox Code Playgroud)
error[E0506]: cannot assign to `number_list` because it is borrowed
  --> src/main.rs:8:5
   |
4  |     let largest_nbr = &number_list[0];
   |                        ----------- borrow of `number_list` occurs here
...
8  |     number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];
   |     ^^^^^^^^^^^ assignment to borrowed `number_list` occurs here
9  |
10 |     println!("The largest number is {}", largest_nbr);
   |                                          ----------- borrow later used here
Run Code Online (Sandbox Code Playgroud)