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

为何未声明为mut的可变引用变量仍可通过其修改数据?

为何未声明为mut的可变引用变量仍可通过其修改数据?

嘿,这个问题问得特别好!刚学Rust的时候,很多人都会在可变引用和变量本身的mut上搞混,我当初也踩过这个坑😅

咱们先把Rust里的两个mut概念掰扯清楚:一个是变量本身的可变性(能不能给这个变量重新赋值),另一个是引用的可变性(能不能通过这个引用修改它指向的数据)。

先看你写的这段代码:

let mut s = String::from("hello");
let r1 = &mut s;

这里的&mut s是可变引用类型——这个类型本身就自带了“允许修改指向数据”的权限,不管变量r1前面加不加mut,你都能通过它修改s的内容。比如你可以直接写:

*r1 = "world".to_string();

完全没问题,因为引用的类型已经赋予了修改权限。

那如果给r1加上mut呢?比如写成let mut r1 = &mut s;,这时候的mut管的是变量r1本身能不能被重新赋值。举个例子:

let mut s = String::from("hello");
let mut s2 = String::from("hi");
let mut r1 = &mut s;
*r1 = "world".to_string(); // 依然可以修改s的内容
r1 = &mut s2; // 现在能把r1重新指向s2了!

但如果r1没加mut,你就做不了r1 = &mut s2这种操作——它的指向是固定死的,不能改。

最后再给你划个重点:

  • &mut T这个引用类型,决定了你能不能通过引用修改目标数据,和变量名前的mut没关系
  • 变量名前的mut,决定了你能不能把这个变量重新赋值成别的引用或者值

刚接触Rust的时候容易把这俩搞混,多写几段代码试一下,很快就能get到区别啦~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:59:31