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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:16:28