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

为何可变引用可赋值给不可变引用类型,却无法通过其修改值?

问题解析:可变引用赋值给不可变引用后无法修改值的原因

先看你的代码:

fn main() {
    let mut x = 10;
    let mut y = 20;
    let mut r = &x;
    r = &mut y; //Ok
    *r = 30;    //Err
}

1. 变量r的类型本质

第一次赋值let mut r = &x;时,r的类型被推断为&i32(不可变引用)。这里的mut修饰的是变量r本身——意思是r这个变量可以被重新赋值指向其他引用,但它指向内容的操作权限,是由引用类型(&i32)决定的,和变量自身的mut修饰符无关。

2. 为什么r = &mut y;能通过编译

Rust允许可变引用隐式转换为不可变引用,这是安全的设计:可变引用本身受借用规则约束,保证当前没有其他引用指向同一数据,转成不可变引用后依然符合安全要求,不会引发数据竞争。所以&mut y(类型&mut i32)可以自动转为&i32,赋值给类型为&i32的r完全合法。

3. 为什么*r = 30;会报错

r的类型是&i32,也就是不可变引用,它的核心特性就是禁止修改指向的内容。哪怕你是把可变引用转成不可变引用赋值给它,一旦类型确定为不可变引用,修改权限就被彻底剥夺了。变量r的mut只是让你能更换它指向的引用,不代表能通过它修改目标数据。

总结来说:mut r是“r这个变量可以被重新赋值”,不是“r指向的内容可以被修改”;&mut i32转成&i32的过程,就是放弃修改权限的过程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:01:16