Rust中如何优先调用结构体自身add方法而非Add trait提供的方法?
解决方案
Rust中当结构体固有方法与实现的trait方法同名时,可以通过完全限定语法显式指定调用结构体的固有方法,避免编译器优先匹配trait方法。
你的场景中只需要将调用行修改为显式调用Sequence的固有add方法即可:
Sequence::add(&mut o, rhs.into()).unwrap();
修正后的完整实现代码
impl<T: Into<u64>> Add<T> for Sequence { type Output = Self; fn add(self, rhs: T) -> Self::Output { let mut o = self.clone(); // 显式调用Sequence结构体的固有add方法,而非当前正在实现的Add trait的add方法 Sequence::add(&mut o, rhs.into()).unwrap(); o } }
原理说明
你遇到的编译错误是因为你正处于Add trait的add方法实现上下文内,编译器解析o.add(...)调用时会优先匹配当前上下文可见的Add trait的add方法(返回值为Sequence,没有unwrap方法),而非结构体的固有add方法。
使用结构体名::方法名的完全限定语法可以明确指定调用的是结构体的固有方法,跳过trait方法的匹配优先级。
内容的提问来源于stack exchange,提问作者Evan Carroll
相关产品推荐
相关产品推荐

