Rust中两种赋值场景的报错差异及借用疑问咨询
Rust中
+=操作的两种报错差异解析 核心:+=依赖AddAssign trait实现
Rust的+=并非简单语法糖,而是通过AddAssign trait完成的,不同的右操作数类型对应不同的trait实现,这直接导致了两个案例的报错差异。
案例1:co += 1的报错
这里1是默认的i32类型,对应的AddAssign<i32>方法签名为:
fn add_assign(&mut self, rhs: i32);
+=本质是对变量的赋值修改,而co是不可变绑定(未加mut),编译器直接检测到不可变变量被二次赋值,抛出**"cannot assign twice to immutable variable co"**——这是最基础的可变绑定错误。
案例2:co += &1的报错
这里&1是&i32类型,对应的AddAssign<&i32>方法签名为:
fn add_assign(&mut self, rhs: &i32);
该方法要求接收self的可变借用,但co是不可变绑定,无法生成可变借用,因此编译器抛出**"cannot borrow co as mutable"**——这是借用检查阶段的错误,和前一个案例的报错触发路径不同,但根源都是co不可变。
关于co被借用的疑问
所有AddAssign的实现都要求第一个参数是&mut self,也就是对变量的可变借用。这是Rust安全模型的要求:修改变量必须通过可变借用或可变绑定,确保同一时间只有一个可变引用存在。你预期co不被借用,可能是混淆了其他语言的运算符逻辑,但在Rust中,这类修改操作必然涉及可变借用。
修复方法很简单,将co声明为可变变量即可:
let mut co = 0; co += 1; // 正常运行 co += &1; // 正常运行
内容的提问来源于stack exchange,提问作者Rizal Fathoni Aji
相关产品推荐
相关产品推荐

