如何在Rust中编写可原地修改整数的trait实现安全累加操作
Rust 整数累加Trait实现问题修复
问题原因
你当前的实现存在两个核心问题,导致try_self_add无法达到预期效果:
try_self_add采用值语义接收self,方法内部修改的self只是原变量的拷贝,修改结果不会同步到外部的原变量- 测试代码中的
x是不可变绑定,本身不允许被修改
修复方案
1. 调整Trait方法签名
将try_self_add的接收者改为&mut self,通过可变借用直接操作原变量的内存地址:
// 这里保留你自己的错误定义逻辑,示例仅做基础补充 #[derive(Debug, Error)] enum SomeError { #[error("addition overflow")] BadError, } type ProgramError = SomeError; type ProgramResult = Result<(), ProgramError>; trait TryAdd { fn try_add(self, rhs: Self) -> Result<Self, ProgramError> where Self: Sized; // 核心修改:接收可变引用作为方法调用者 fn try_self_add(&mut self, rhs: Self) -> ProgramResult; }
2. 修正u128的实现代码
impl TryAdd for u128 { fn try_add(self, rhs: Self) -> Result<Self, ProgramError> { self.checked_add(rhs).ok_or(SomeError::BadError.into()) } fn try_self_add(&mut self, rhs: Self) -> ProgramResult { // 解引用self直接修改原变量的值 *self = self.try_add(rhs)?; Ok(()) } }
3. 修正测试代码
将测试中的变量x声明为可变绑定:
#[test] fn test_self_add() { let mut x = 10; let y = 2; x.try_self_add(y).unwrap(); assert_eq!(x, 12); }
内容的提问来源于stack exchange,提问作者ilmoi
相关产品推荐
相关产品推荐

