为何可变引用可赋值给不可变引用类型,却无法通过其修改值?
问题解析:可变引用赋值给不可变引用后无法修改值的原因
先看你的代码:
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
相关产品推荐
相关产品推荐

