生锈 – 非重叠实现会导致一致性规则?

在我的
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不允许这种结构.据我所知,没有解决方法.

点赞