Rust中为何*value += how_much与*value += *how_much两种写法均有效?
Rust中引用直接参与+=运算的原因
你碰到的这个情况,本质是Rust为了简化代码,给基本类型做了两项贴心设计:
针对引用的运算符重载实现
Rust的+=运算符对应AddAssigntrait,标准库不仅给i32实现了接受i32参数的AddAssign,还额外实现了接受&i32参数的版本。标准库里的核心实现逻辑大概是这样:// 接受值类型的实现 impl AddAssign<i32> for i32 { fn add_assign(&mut self, rhs: i32) { *self = *self + rhs; } } // 接受引用类型的实现 impl AddAssign<&i32> for i32 { fn add_assign(&mut self, rhs: &i32) { *self += *rhs; } }当你写
*value += how_much时,编译器会自动匹配到第二个接受引用的实现,帮你完成内部的解引用操作,所以你不用手动写*how_much也能正常运行。Deref强制转换的辅助作用
另外,&i32类型实现了Dereftrait,编译器在需要i32类型的上下文里,会自动把&i32解引用成i32。就算没有上面的引用版运算符实现,编译器也会通过Deref自动把how_much转成i32,让代码正常编译。
两种写法(加不加*)都是完全合法的,最终效果没有任何区别——只是Rust帮你省了手动解引用的步骤而已。
内容的提问来源于stack exchange,提问作者Vraj Shah
相关产品推荐
相关产品推荐

