为何可同时传递u32类型的可变与不可变引用?
为什么你的Rust代码没触发可变/不可变引用冲突?
你没遗漏核心要点,只是没注意到Rust借用规则里的**「同一时间」这个关键前提:Rust禁止的是同一作用域内同时存在一个可变引用和任意不可变引用**,而你的代码里两个引用的生命周期根本没重叠。
具体来说:
- 调用
do_something(&mut num)时,可变引用仅在函数执行期间存在,函数执行完毕后这个可变引用就被立即销毁了。 - 之后调用
dont_do_anything(&num)时,才创建新的不可变引用,此时没有任何可变引用存活,完全符合借用规则,自然不会报错。
如果把代码改成下面这样,让两个引用的生命周期重叠,就会触发编译器错误:
fn main() { let mut num = 69; let mut_ref = &mut num; // 可变引用存活 let immut_ref = # // 此时尝试创建不可变引用,直接报错 do_something(mut_ref); dont_do_anything(immut_ref); } fn dont_do_anything(num: &u32) { println!("{}", num); } fn do_something(num: &mut u32) { *num += 1; }
内容的提问来源于stack exchange,提问作者Karan Kumar
相关产品推荐
相关产品推荐

