为何Rust中被借用变量不会随原变量变更而改变?
为什么重新赋值number_list后,之前的借用没有指向新的vector?
你遇到的问题核心在于变量遮蔽和Rust的变量绑定规则,并非借用原则的问题,具体拆解如下:
第一个number_list是独立的vector实例
你最初用let number_list = vec![34, 50, 25, 100, 65];创建了第一个vector,栈上的number_list变量绑定到堆上这个vector的内存地址。largest_nbr = &number_list[0]是对这个vector第一个元素的不可变借用,指向堆上存储34的位置。重新let的number_list是新变量,和原变量无关
当你写let number_list = vec![102, ...];时,这不是修改原来的number_list,而是变量遮蔽——在当前作用域创建了一个同名的新变量,绑定到新的vector实例。原来的第一个vector并没有被销毁,因为largest_nbr还在借用它(Rust的借用检查器会确保被借用的值不会提前释放)。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
相关产品推荐
相关产品推荐

