Rust中解引用与借用为何未违反借用规则?
问题解答
先明确Rust的核心借用规则:
- 同一时间,要么只能有一个可变引用,要么可以有多个不可变引用,二者绝对不能同时存在。
- 所有引用必须始终有效,不能出现悬垂引用。
为什么f2可以正常创建?
f2是通过&(*f)从可变引用f本身派生出来的不可变引用。这时候Rust的借用检查器会跟踪这种引用层级关系:
f2的生命周期完全被包含在f的生命周期内;- 在
f2存在的期间,f会被“冻结”——你无法再通过f修改y,也不能用f创建其他可变或冲突的引用; - 这种派生行为是安全的,因为本质上是从已有的引用(而非直接操作原变量)创建的,借用检查器能确保不会出现数据竞争。
为什么f3无法创建?
f3是直接从原变量y创建的不可变引用,这相当于尝试绕开已存在的可变引用f,直接对y建立新的引用。此时借用检查器会发现:
y已经有一个活跃的可变引用f,且f3和f的作用域完全重叠;- 这直接违反了“可变引用必须唯一”的规则——如果允许
f3存在,就会同时出现可变引用f和不可变引用f3,可能导致数据竞争(比如通过f修改y的同时,f3读取y)。
举个额外的例子验证:如果在创建f2之后尝试通过f修改y,比如*f = String::from("foo"),编译器会直接报错,因为f2的存在冻结了f的可变能力,这也侧面证明了借用检查器对这种派生关系的跟踪是严格的。
内容的提问来源于stack exchange,提问作者user3690467
相关产品推荐
相关产品推荐

