Rust中满足约束的i32为何不实现组合别名trait及解决方法
问题原因
你定义的Math是一个带超trait约束的自定义trait,Rust不会自动为满足所有超trait约束的类型实现这个自定义trait,必须手动声明实现规则。
解决方法
添加**泛型覆盖实现(blanket implementation)**即可,对所有满足Num + One + Zero + PartialOrd + RemAssign + Ord约束的类型,自动实现Math trait。修改后的完整代码如下:
use num_traits::{Num, identities::One, identities::Zero}; use std::cmp::{Ord, PartialOrd}; use std::ops::RemAssign; // 定义组合约束的trait pub trait Math: Num + One + Zero + PartialOrd + RemAssign + Ord {} // 新增这一行 blanket 实现,所有满足约束的类型都会自动实现Math trait impl<T: Num + One + Zero + PartialOrd + RemAssign + Ord> Math for T {} fn s<T: Num + One + Zero + PartialOrd + Ord + RemAssign>(t: T) { unimplemented!(); } fn ss<T: Math>(t: T) { unimplemented!(); } fn sss() { let x: i32 = 5; ss(x); // 现在可以正常编译 }
注意事项
- 这种泛型覆盖实现仅能在你定义
Mathtrait的 crate 中编写,符合Rust孤儿规则(Math是自定义的本地trait,不存在实现规则冲突)。 - 后续所有满足约束的数值类型(包括i32、u32、i64等)都会自动实现
Mathtrait,不需要逐个手动实现。
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

