You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Rust中被借用变量不会随原变量变更而改变?

为什么重新赋值number_list后,之前的借用没有指向新的vector?

你遇到的问题核心在于变量遮蔽和Rust的变量绑定规则,并非借用原则的问题,具体拆解如下:

  1. 第一个number_list是独立的vector实例
    你最初用let number_list = vec![34, 50, 25, 100, 65];创建了第一个vector,栈上的number_list变量绑定到堆上这个vector的内存地址。largest_nbr = &number_list[0]是对这个vector第一个元素的不可变借用,指向堆上存储34的位置。

  2. 重新let的number_list是新变量,和原变量无关
    当你写let number_list = vec![102, ...];时,这不是修改原来的number_list,而是变量遮蔽——在当前作用域创建了一个同名的新变量,绑定到新的vector实例。原来的第一个vector并没有被销毁,因为largest_nbr还在借用它(Rust的借用检查器会确保被借用的值不会提前释放)。

  3. largest_nbr的借用始终指向第一个vector
    由于largest_nbr绑定的是第一个vector元素的引用,和后来新创建的number_list变量没有任何关联,所以第二个println依然输出第一个vector的元素值34。

修正方案:使用可变变量而非变量遮蔽

如果想要让同一个变量指向新的vector,并且后续能借用新vector的元素,需要将变量声明为可变(mut),同时确保修改变量前释放之前的借用:

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);
    } // largest_nbr的借用在此处结束

    // 修改可变变量,指向新的vector
    number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8];

    let largest_nbr = &number_list[0];
    println!("The largest number is {}", largest_nbr);
}

执行这段代码后,输出会符合你的预期:

The largest number is 34
The largest number is 102

关键补充

  • 变量遮蔽:同名新变量会隐藏旧变量,但两者是完全独立的绑定,修改新变量不会影响旧变量或其借用。
  • 可变变量与借用规则:Rust不允许同时存在活跃的不可变借用和可变借用,所以必须让之前的借用(largest_nbr)先失效(比如通过代码块限制生命周期),才能修改number_list。

内容的提问来源于stack exchange,提问作者BonisTech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:25:21