【问题标题】:Why does a borrowed variable not change when the borrowed from variable changes?为什么当借用变量发生变化时,借用变量不会改变?
【发布时间】:2022-11-26 18:57:39
【问题描述】:

我是生锈的新手,正在尝试了解借用原则。

我有以下代码:

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的值不应该也改变吗?

【问题讨论】:

    标签: rust cargo


    【解决方案1】:

    该行:

    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

    看:

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

    【讨论】:

      【解决方案2】:

      你不是在改变 number_list 的值,你是在隐藏它。即使你改变了你的number_listlargest_number也不会改变(只是掉线)。为什么?因为 Vec 基本上只是一个指针、长度和容量,并没有连接到缓冲区。只有数组(不是切片!)才是真正的缓冲区。那你怎么改变你的Vec?不行!当一个变量仍然被借用为不可变时,你不能改变它。而且你不需要这个,所以不要尝试。

      【讨论】:

      • “你不需要这个,所以不要尝试”- 我部分不同意这种说法。特别是来自其他语言如C/C++的人会觉得这是非常需要的。我宁愿说有更适合借用检查语言的可行替代方案。
      猜你喜欢
      • 2017-05-09
      • 2015-10-16
      • 2015-08-05
      • 2015-01-07
      • 2017-02-11
      • 2017-05-02
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多