非重叠实现是否违反一致性规则?

4
在我的 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”被定义为“pub struct Optioned { value: T }”。对于所有数字基元类型,都预定义了“Noned”特征。
现在,既然“f32”和“f64”都没有实现“Eq”,因此我认为 impls 应该是严格非重叠的。有人能
- 解释为什么一致性规则会使我陷入困境, - 告诉我如何更改代码以使其正常工作吗?

1
我相信 https://github.com/rust-lang/rust/issues/23086(在“更具体地从负面推理中产生的危险”标题下)回答了你的第一个问题,但恐怕我想不出一个好的解决方案。 - fjh
哎呀。是的,看起来这就是问题所在。所以我猜正确的解决方案要么是为每个类型都实现这个,要么就等待开发人员实现专门化或负面特性边界。 - llogiq
1个回答

2
现在,f32f64都没有实现Eq,因此我认为这些实现应该是严格不重叠的。 问题在于您无法控制f32f64类型。那些类型的实现者(在这种情况下是语言本身)可能会选择在将来为这些类型实现Eq。 如果发生这种情况,那么当您更新包含这些类型的crate(或者在这种情况下是语言)时,您的代码将突然失效。为了防止这种情况发生,Rust禁止这种构造。据我所知,没有解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接