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

时间:2015-07-24 13:05:46

标签: rust

在我的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特征是为所有数字原语预定义的。

现在,f32f64都没有实现Eq,所以我认为impl严格来说不重叠。有人可以

  • 解释为什么一致性规则让我失望和
  • 告诉我如何更改我的代码以使其正常工作?

1 个答案:

答案 0 :(得分:2)

  

现在,f32和f64都没有实现Eq,所以我认为impl严格来说不重叠。

问题源于您无法控制f32f64类型的事实。这些类型的实现者(在本例中为语言本身)可以选择为将来的类型实现Eq

如果发生这种情况,那么当你更新类型来自的crate(或者在这种情况下是语言)时,你的代码会突然开始失败。为了防止这种情况,Rust不允许这种结构。据我所知,没有解决方法。