在我的optional包中,我想为所有预先声明的类型实施Eq
,并允许用户通过让他们的类型声明Eq
来加入。所以我写道:
impl<T: Noned + Copy + Eq + PartialEq> Eq for Optioned<T> {}
impl Eq for Optioned<f32> {}
impl Eq for Optioned<f64> {}
然而,rustc抱怨E0119
,说我违反了一致性规则。
我的Optioned<T>
定义为pub struct Optioned<T: Noned + Copy> { value: T }
。 Noned
特征是为所有数字原语预定义的。
现在,f32
和f64
都没有实现Eq
,所以我认为impl严格来说不重叠。有人可以
答案 0 :(得分:2)
现在,f32和f64都没有实现Eq,所以我认为impl严格来说不重叠。
问题源于您无法控制f32
或f64
类型的事实。这些类型的实现者(在本例中为语言本身)可以选择为将来的类型实现Eq
。
如果发生这种情况,那么当你更新类型来自的crate(或者在这种情况下是语言)时,你的代码会突然开始失败。为了防止这种情况,Rust不允许这种结构。据我所知,没有解决方法。