我见过一个与此类似的问题,但没有人确切地告诉我如何为结构实现 Ord
。例如,以下内容:
struct SomeNum {
name: String,
value: u32,
}
impl Ord for SomeNum {
fn cmp(&self, other:&Self) -> Ordering {
let size1 = self.value;
let size2 = other.value;
if size1 > size2 {
Ordering::Less
}
if size1 < size2 {
Ordering::Greater
}
Ordering::Equal
}
}
这给了我错误:
error: the trait `core::cmp::Eq` is not implemented for the type `SomeNum` [E0277]
我该如何解决这个问题?我尝试将实现更改为:
impl Ord for SomeNum where SomeNum: PartialOrd + PartialEq + Eq {...}
并添加适当的 partial_cmp
和 eq
函数,但它给我的错误是这两个方法都不是 Ord
的成员。
最佳答案
Ord
的定义这是:
pub trait Ord: Eq + PartialOrd<Self> {
fn cmp(&self, other: &Self) -> Ordering;
}
任何实现 Ord
的类型还必须实现 Eq
和 PartialOrd<Self>
.您必须为 SomeNum
实现这些特征.
顺便说一句,您的实现方式看起来是错误的;如果self.value
就是您要比较的所有内容,self.value > other.value
应该是 Greater
, 不是 Less
.
您可以使用 Ord
在 u32
上实现协助,如果你愿意的话:self.value.cmp(other.value)
.
您还应该考虑到 Ord
是一个总排序。如果你的PartialEq
例如,实现采用 name
考虑到,你的Ord
执行必也。为方便起见,最好使用元组(表示比较中最重要的字段是 value
,但如果它们相同,则应考虑 name
),如下所示:
struct SomeNum {
name: String,
value: u32,
}
impl Ord for SomeNum {
fn cmp(&self, other: &Self) -> Ordering {
(self.value, &self.name).cmp(&(other.value, &other.name))
}
}
impl PartialOrd for SomeNum {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl PartialEq for SomeNum {
fn eq(&self, other: &Self) -> bool {
(self.value, &self.name) == (other.value, &other.name)
}
}
impl Eq for SomeNum { }
如果你这样做,你不妨重新排序字段并使用 #[derive]
:
#[derive(PartialEq, Eq, PartialOrd, Ord)]
struct SomeNum {
value: u32,
name: String,
}
这将扩展到基本相同的东西。
关于rust - 如何为结构实现 Ord?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884402/