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

Rust中通过解引用可变引用修改数据是否违反单一所有权原则?

你的代码完全没有违反Rust的所有权规则

先给结论:你贴的这段代码完全符合Rust核心所有权规则,困惑主要是对「借用权限」和「所有者」的边界理解有偏差。

先明确两个规则的真实含义

  • 引用仅为借用而非拥有数据:可变引用本质是临时获取了数据的修改权限,但它从来不会成为数据的所有者。数据的所有权始终牢牢握在原变量(v/v2)手里,借用结束后,原变量依然拥有完整的所有权。
  • 数据仅存在唯一所有者:这里的「所有者」指对数据拥有最终处置权(比如销毁、转移)的实体,你的代码里v和v2从始至终都是各自Vec的唯一所有者,可变引用只是临时「借走」修改权,根本算不上所有者。

拆解你的两段代码

第一段:修改Vec中的单个元素

let mut v = vec![1, 2, 3];
let ref_i = &mut v[0];
*ref_i = 10;
println!("{v:?}");
  • &mut v[0]是向所有者v借用了它第一个元素的可变访问权,ref_i只是这个借用的「凭证」。
  • 修改*ref_i其实是通过这个凭证,直接修改所有者v名下的数据,并没有改变所有权归属。
  • 当ref_i执行完赋值后就不再被使用,Rust会自动结束这次借用,所以后面v依然能正常被打印——因为它的所有权从未丢失。

第二段:替换整个Vec

let mut v2 = vec![1, 2, 3];
let ref_v2 = &mut v2;
*ref_v2 = vec![10, 20, 30];
println!("{v2:?}");
  • &mut v2是借用了整个v2的可变访问权,ref_v2同样只是借用凭证。
  • *ref_v2 = vec![...]的本质是:通过借用的权限,让所有者v2放弃原来的Vec(会被自动销毁),转而持有新的Vec——新Vec的所有者依然是v2,和ref_v2无关。
  • 同样,借用在赋值后就结束了,v2继续拥有完整所有权,所以能正常打印。

额外补充:可变引用的核心约束

Rust对可变引用的限制是同一时间只能存在一个可变引用,或者多个不可变引用,这是为了避免数据竞争,但你的代码里每次都只存在一个可变引用,且借用结束后才会再次使用原变量,完全符合这个约束。

内容的提问来源于stack exchange,提问作者maki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:33:14