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

时间:2017-07-11 11:47:29

标签: rust

我想要min()f32u32的{​​{1}}方法,所以我创建了一个特征i32

Min

我收到错误:

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)
    }
}

根据Rust标准库文档,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` 未实现f32。为什么存在冲突的实施?

1 个答案:

答案 0 :(得分:6)

我认为这是因为编译器不能排除有一天某人 Ord实施f32的可能性。换句话说:如果编译器没有保守地行事,那么在现有类型上实现任何新特征将是一个重大改变。这将严重限制每个图书馆的成长能力,而不会破坏所有下游用户。

没有直接解决方法,因为它是语言的有意设计选择。最接近的是实现包装类型围绕 f32 struct OrdF32(f32);)并实施OrdMin那个上,或使用定义这样一个包装器的包(例如ordered-float)。