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

Rust所有权转移与可变引用疑问:为何p2无需mut即可修改?

问题解答

核心要区分变量的可变性和引用的可变性两个完全不同的概念:

  • 对于拥有所有权的变量(比如p1):变量的mut标记决定了你能否通过这个变量修改它指向的数据。因为Vec::push方法需要接收&mut self(自身的可变引用),只有当变量被声明为mut时,你才能从这个变量获取到&mut self来调用修改类方法。

  • 对于持有可变引用的变量(比如p2):p2是一个存储了可变引用的不可变变量。变量本身的不可变性,仅意味着你不能把p2重新赋值成另一个引用;但它存储的&mut p1本身就具备修改目标数据的权限,所以直接用它调用push这类需要&mut self的方法完全合法。

举个反例验证:如果尝试给p2重新赋值,编译器会报错,因为它不是mut变量:

let p = vec![23, 3, 31, 4];
let mut p1 = p;
let p2 = &mut p1;
p2 = &mut vec![]; // 编译失败:cannot assign to immutable variable `p2`

但调用p2.push(11)完全没问题,因为我们只是在使用可变引用的修改权限,而非修改p2这个变量本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:02:34