rust 为什么借入变量在借入自变量发生变化时不发生变化?

1hdlvixo  于 2022-11-30  发布在  其他
关注(0)|答案(2)|浏览(230)

我是个新手,正试图理解借贷原则。
下面的代码:

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);
}

当我执行cargo run时,得到以下结果:

> The largest number is 34
> The largest number is 34

我希望第二行会说102是最大的数,因为largest_nbr是从number_list借用的,所以指针显示在number_list的存储位置。当number_list的值改变时,largest_nbr的值是否也应该改变?

ogq8wdun

ogq8wdun1#

行:

let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];
    • 不**修改原始的number_list变量。它创建一个新的变量,并以相同的名称命名它,遮蔽原始名称。

简单地说,这意味着现在存在两个number_list变量,但第一个变量不再可访问,因为第二个变量已经接管了名称,而largest_nbr变量引用了第一个变量。
请注意,这里所做的尝试是不可能的,因为当你借用数组的一部分时,你不能修改数组。我猜这就是为什么你要在数组中添加一个let,因为如果你只写number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8],而不写let,你会得到一个错误,告诉你当它在largest_nbr中被借用时,你不能修改它。
请参阅:
第一次

0vvn1miw

0vvn1miw2#

你不是在改变number_list的值,你是在遮蔽它。即使你改变了number_listlargest_number也不会改变(刚刚删除)。为什么?因为Vec基本上只是一个指针,长度和容量,并且未连接到缓冲区。只有数组(而不是切片!)是真实的的缓冲区。那么你如何 * 改变 * 你的Vec呢?无论如何!你不能改变一个变量,而它仍然是作为不可变的被借用的。你不需要这样做,所以不要尝试。

相关问题