rust - 如何为结构实现 Ord?

标签 rust ord

我见过一个与此类似的问题,但没有人确切地告诉我如何为结构实现 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_cmpeq 函数,但它给我的错误是这两个方法都不是 Ord 的成员。

最佳答案

Ord 的定义这是:

pub trait Ord: Eq + PartialOrd<Self> {
    fn cmp(&self, other: &Self) -> Ordering;
}

任何实现 Ord 的类型还必须实现 EqPartialOrd<Self> .您必须为 SomeNum 实现这些特征.

顺便说一句,您的实现方式看起来是错误的;如果self.value就是您要比较的所有内容,self.value > other.value应该是 Greater , 不是 Less .

您可以使用 Ordu32 上实现协助,如果你愿意的话: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/

相关文章:

rust - 我可以修改 BinaryHeap 中不是最高值的值吗?

iterator - 是否可以将折叠与 Vec 一起使用?

python - Python ord函数中的多个字符

python - Python 2.7 和 3.9 之间 ord() 函数的差异

python - 尝试使用 Scapy 从 802.11 帧检索 channel

postgresql - 当字段类型在编译时未知时,如何使用tokio-postgres枚举列?

rust - 需要引用时有条件地克隆

arrays - 我如何在 Rust 中索引 C 数组?

Python 效率 - 比多个 if elif 语句更好的版本 - 使用 for 循环 - chr ord 转换?

Python:使用追加将列表中的字符串值更改为 ascii 值