rust - 非重叠实现行程一致性规则?

标签 rust

在我的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.

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

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

关于rust - 非重叠实现行程一致性规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31611318/

相关文章:

rust - 通过使用 nix(mkDerivation 或类似的)运行 'cargo',使用 .cargo/registry 创建 nix 存储路径

pointers - 为什么使用原始指针的链表中的节点会损坏?

rust - 在 Rust 中将字符串搜索到 Vec<String>

rust - 引用 rust 中的引用资料

rust - 如何删除值周围的 `MutexGuard`?

asynchronous - 如何在启动异步操作和在循环中等待其结果之间有一个宽限期?

module - Rust:无法从 2 个文件导入 1 个模块

compiler-errors - 如何使用 Ord::max 函数?

rust - 如何在跟踪中使用动态范围名称?

generics - 有没有一种方法可以实现与泛型相结合的 `as`语义?