Rust中同作用域允许可变变量创建可变引用的设计缘由与用例
Rust可变引用的设计缘由与适用场景
先看两段Rust代码的对比:
合法代码
fn foo() { let mut x = 5; let xr = &mut x; }
不合法代码
fn foo() { let mut x = 5; let xr = &mut x; let y = x; // (*) println!("xr is {}", xr); println!("y is {}", y); }
在标注(*)的行会触发错误:
cannot use
xbecause it was mutably borrowed
既然存在这样的借用限制,为何Rust允许在变量定义的同作用域中为其创建可变引用?我们本可直接使用变量本身,若需调用接收可变引用的函数,也可仅在调用时创建临时可变引用。那么该设计的语言层面缘由是什么?又有哪些适用场景?
语言层面的设计缘由
- 规则一致性要求:Rust的借用规则核心是保障内存安全——同一时间要么只有一个可变引用,要么有多个不可变引用。允许在同作用域创建可变引用是这套规则的自然延伸,并非特殊例外。要是禁止这种情况,反而得添加额外限制,把规则搞复杂,破坏语言设计的简洁性和一致性。
- 所有权逻辑的必然结果:Rust的所有权系统中,可变引用是临时“借走”变量可变访问权的方式,哪怕在同作用域内,这种借用关系也需要被明确追踪。允许显式创建可变引用,是让开发者能主动控制借用的生命周期,而非只能依赖临时引用的隐式生命周期。
适用场景
- 复用可变引用:如果需要多次对同一个变量执行可变操作,且每次操作都依赖可变引用(比如多次调用同一个接收可变引用的函数),显式创建一个可变引用并复用,比每次重复写
&mut x更简洁,也能明确告知读者这段代码中变量处于被可变借用的状态。
示例代码:fn modify(val: &mut i32) { *val += 1; } fn foo() { let mut x = 5; let xr = &mut x; modify(xr); modify(xr); // 直接复用xr,无需重复书写&mut x println!("{}", xr); } - 支持长期持有可变引用的场景:有些结构体或函数需要持有可变引用一段时间(比如将可变引用存储为结构体字段),此时必须显式创建可变引用并传递——临时引用的生命周期通常仅局限于调用表达式内部,无法满足长期持有的需求。
- 提升代码可读性:显式创建可变引用能让代码意图更清晰,阅读者一眼就能识别:从创建引用的位置开始,变量
x的可变访问权已转移至xr,直到xr被销毁或不再使用。这种显式标注比隐式的临时引用更具可读性,尤其在复杂代码逻辑中。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

