我想要min()
,f32
和u32
的{{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
。为什么存在冲突的实施?
答案 0 :(得分:6)
我认为这是因为编译器不能排除有一天某人 为Ord
实施f32
的可能性。换句话说:如果编译器没有保守地行事,那么在现有类型上实现任何新特征将是一个重大改变。这将严重限制每个图书馆的成长能力,而不会破坏所有下游用户。
没有直接解决方法,因为它是语言的有意设计选择。最接近的是实现包装类型围绕 f32
(即 struct OrdF32(f32);
)并实施Ord
或Min
在那个上,或使用定义这样一个包装器的包(例如ordered-float
)。