当前位置: 首页 > 知识库问答 >
问题:

为什么没有实现Ord的f32会得到“特征的冲突实现”?

杜英叡
2023-03-14

我想要一个min()方法,用于f32u32i32,因此我创建了一个traitmin

trait Min {
    fn min(v1: Self, v2: Self) -> Self;
}

impl<T> Min for T where T: Ord {
    fn min(v1: Self, v2: Self) -> Self {
        ::std::cmp::min(v1, v2)
    }
}

impl Min for f32 {
    fn min(v1: Self, v2: Self) -> Self {
        v1.min(v2)
    }
}

我得到一个错误:

error[E0119]: conflicting implementations of trait `Min` for type `f32`:
  --> src/main.rs:11:1
   |
5  | / impl<T> Min for T where T: Ord {
6  | |     fn min(v1: Self, v2: Self) -> Self {
7  | |         ::std::cmp::min(v1, v2)
8  | |     }
9  | | }
   | |_- first implementation here
10 | 
11 | / impl Min for f32 {
12 | |     fn min(v1: Self, v2: Self) -> Self {
13 | |         v1.min(v2)
14 | |     }
15 | | }
   | |_^ conflicting implementation for `f32`

根据Rust标准库文档,f32未实现Ord。为什么存在冲突的实现?

共有1个答案

赵钊
2023-03-14

我相信这是因为编译器不能排除有一天,有人会为f32实现Ord。换句话说:如果编译器不采取保守的行为,那么在现有类型上实现任何新特性都将是一个突破性的改变。这将严重限制每个图书馆在不破坏所有下游用户的情况下发展的能力。

没有直接的方法来解决这个问题,因为这是语言有意的设计选择。最接近的方法是在f32(即struct OrdF32(f32);)周围实现包装类型,并在此基础上实现OrdMin,或者使用定义此类包装器的板条箱(例如作为有序-浮动)。

 类似资料:
  • 虽然Rust中的所有整数类型都实现了强调总排序的,但浮点类型只实现了。这意味着可能存在无法比较的浮点值。这似乎很难理解,因为浮点数可以被认为是实数的近似值,实数碰巧是一个完全有序的集合。即使加上正无穷大和负无穷大,也会使实数集保持完全有序。为什么在铁锈这个奇怪的选择? 这种限制意味着通用排序/搜索算法只能假设数字的部分排序。IEEE 754标准似乎提供了一个总排序谓词。 NaN在通用代码中是个大问

  • 我试图在生锈中编写一些通用的数学函数,我一直遇到以下错误消息: 有可能解决这个问题吗?如果是,怎么做? 例如,我正在尝试编写一个通用的点积,它使用两个迭代器,对它们进行压缩,并对这些迭代器对进行迭代,以累积积。我希望这个函数也能计算复数点积。复数上的点积包括共轭一面。我的第一个想法是为一个二进制函数编写一个trait,以替换,因为它还与左侧参数共轭。以下是完整的代码: 因为一个

  • 在的留档中,它说 实现必须与PartialOrd实现一致[…] 这当然是有道理的,并且可以很容易地归档,如下面的示例所示: 我想知道,为什么他们会把这个负担/风险留给我们用户,而不是用毯子 我在操场上测试了循环依赖和其他东西的问题,但这和我预期的一样有效。互联网也没有产生任何结果。 我能想到的另一个原因是宏现在是如何工作的。人们可能必须将每个替换为(或者将(PartialOrd)的宏变得更智能-我

  • 我有广泛的基本特征。有些类型只关心其功能的子集,所以我添加了一个子集,要求用户实现更小的功能集。 此代码失败: 出现以下错误: 有趣的是,当我删除上的通用性时,它就起作用了: stackoverflow上的其他一些帖子也提到了类似的问题,但它们通常都有关于外来特征的问题(来自标准库的)。在我的案例中,特质和类型都是本地的,因此就我所知,孤儿规则不应该生效。 基本上,错误提到下游板条箱可能实现tra

  • 我正在尝试将DHT11库用于我的STM32F303VC 我得到错误: 我的错误图像: 我的代码在辅助模块中是: 我的main.rs代码是:

  • 我有一个设计问题,当使用类似的东西时: 我认为应该有一些更好的方法来实现这种参数化的特性。 我在std中没有找到好的示例(例如,在具有类似的关联类型的traits中没有实现)?