Rust自定义泛型枚举实现Neg/Sub trait编译失败,需补充哪些约束?
解决自定义枚举实现Neg和Sub trait的泛型约束问题
你需要为泛型T补充关联类型的约束,确保Sub和Neg操作的返回值类型仍为T,这样才能正确构造PolRec<T>实例。以下是具体修正方案:
问题根源
Rust的Sub和Neg trait都包含关联类型Output,默认情况下编译器无法推断操作后的返回类型就是T。比如T: Sub只保证T能做减法,但减法结果可能是另一种类型,而你的代码需要减法/取反结果必须是T才能放入PolRec的变体中。
修正后的代码
use std::ops::{Neg, Sub}; #[derive(Debug)] enum PolRec<T> { BTuple(T, T), Singly(T) } impl<T> Sub for PolRec<T> where // 明确指定Sub操作的输出类型为T T: Sub<Output = T>, { type Output = PolRec<T>; fn sub(self, rhs: PolRec<T>) -> PolRec<T> { match (self, rhs) { (PolRec::BTuple(x, y), PolRec::BTuple(x2, y2)) => PolRec::BTuple(x-x2, y-y2), (PolRec::BTuple(x, y), PolRec::Singly(t)) => PolRec::BTuple(x-t, y-t), (PolRec::Singly(t), PolRec::BTuple(x, y)) => PolRec::BTuple(t-x, t-y), (PolRec::Singly(t), PolRec::Singly(t2)) => PolRec::Singly(t-t2), } } } impl<T> Neg for PolRec<T> where // 明确指定Neg操作的输出类型为T T: Neg<Output = T>, { type Output = PolRec<T>; fn neg(self) -> PolRec<T> { match self { PolRec::BTuple(x, y) => PolRec::BTuple(-x, -y), PolRec::Singly(t) => PolRec::Singly(-t) } } } fn main() { let bt = PolRec::BTuple(6., 5.); println!("{:?}", -bt); println!("{:?}", bt-PolRec::Singly(6.)); }
关键修改点
- 对于
Sub实现:将T: Sub改为T: Sub<Output = T>,确保T的减法操作返回值类型仍是T。 - 对于
Neg实现:将T: Neg改为T: Neg<Output = T>,确保T的取反操作返回值类型仍是T。
这样编译器就能确认所有运算结果都能正确放入PolRec<T>的变体中,代码即可正常编译运行。
内容的提问来源于stack exchange,提问作者Aroka
相关产品推荐
相关产品推荐

