gpt4 book ai didi

rust - 如何为结构实现 Ord?

转载 作者:行者123 更新时间:2023-11-29 07:41:48 25 4
gpt4 key购买 nike

我见过一个与此类似的问题,但没有人确切地告诉我如何为结构实现 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/

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