我正在尝试实现一个整数的特性,为自己添加一个值。
我的失败尝试:
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.try_add(rhs)?;
Ok(())
}
}
第一个函数按预期工作,返回一个添加了rhs的新整数。第二个函数目前不起作用。
我想让它做什么:
#[test]
fn test_self_add() {
let x = 10;
let y = 2;
x.try_self_add(y).unwrap();
assert_eq!(x, 12);
}
有办法做到这一点吗?
在try_self_add
中,您修改值的副本而不是值本身,因此这是预期的行为(这也是为什么测试中的x
不需要是mut
)。你真正想要的是:
fn try_self_add(&mut self, rhs: Self) -> ProgramResult {
*self = self.try_add(rhs)?;
Ok(())
}
经过这样的修改后,它就像预期的那样工作了。