在我的optional crate ,我想实现 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
,所以我会认为 impls 是严格不重叠的。有人可以吗
- 解释为什么连贯性规则让我感到困惑
- 告诉我如何更改我的代码以使其正常工作?
最佳答案
Now, neither f32 nor f64 implement Eq, so I would have thought the impls be strictly non-overlapping.
问题源于您无法控制类型 f32
或 f64
。这些类型的实现者(在本例中为语言本身)可以选择在将来为这些类型实现Eq
。
如果发生这种情况,那么当您更新类型来自的包(或语言,在这种情况下)时,您的代码就会突然开始失败。为了防止这种情况,Rust 不允许这种构造。据我所知,没有解决方法。
关于rust - 非重叠实现行程一致性规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31611318/