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

如何在Rust中编写可原地修改整数的trait实现安全累加操作

Rust 整数累加Trait实现问题修复

问题原因

你当前的实现存在两个核心问题,导致try_self_add无法达到预期效果:

  1. try_self_add采用值语义接收self,方法内部修改的self只是原变量的拷贝,修改结果不会同步到外部的原变量
  2. 测试代码中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:54:02