在我的
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,说我违反了一致性规则.
我的选择< T>被定义为pub结构Optioned< T:Noned Copy> {值:T}. Noned特征是为所有数字原语预定义的.
现在,f32和f64都没有实现Eq,所以我认为impl严格不重叠.有人可以
>解释为什么连贯性规则会让我失望
>告诉我如何更改我的代码以使其工作?
最佳答案
Now, neither f32 nor f64 implement Eq, so I would have thought the impls be strictly non-overlapping.
问题源于您不控制f32或f64类型的事实.这些类型的实现者(在本例中是语言本身)可以选择在将来为这些类型实现Eq.
如果发生这种情况,那么当你更新类型来自的crate(或者在这种情况下是语言)时,你的代码会突然开始失败.为了防止这种情况,Rust不允许这种结构.据我所知,没有解决方法.