Self; } i-6ren">
gpt4 book ai didi

rust - 为什么没有实现 Ord 的 f32 得到 "conflicting implementations of trait"?

转载 作者:行者123 更新时间:2023-11-29 07:50:33 24 4
gpt4 key购买 nike

我想要一个用于f32u32i32min() 方法,所以我创建了一个特征最小值:

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。为什么会有冲突的实现?

最佳答案

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

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

关于rust - 为什么没有实现 Ord 的 f32 得到 "conflicting implementations of trait"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45033704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com