Rust 如何为结构实现Ord?

Rust 如何为结构实现Ord?,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 siz

我见过一个类似的问题,但没有人告诉我如何为结构实现
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
    }
}
我该如何解决这个问题?我已尝试将实施更改为:

impl Ord for SomeNum where SomeNum: PartialOrd + PartialEq + Eq {...}
添加适当的
partial_cmp
eq
函数,但这给了我一个错误,即这两种方法都不是
Ord
的成员。定义如下:

Ord:Eq+PartialOrd{
fn cmp(&self,其他:&self)->订购;
}
任何实现
Ord
的类型也必须实现
Eq
PartialOrd
。您必须为
SomeNum
实现这些特性

顺便说一句,您的实现看起来是错误的;如果您只比较了
self.value
self.value>other.value
应该大于
而不是小于

如果需要,您可以使用
u32上的
Ord
实现来提供帮助:
self.value.cmp(other.value)

您还应考虑到,
Ord
是一个总订单。例如,如果您的
PartialEq
实现考虑了
name
,则您的
Ord
实现也必须考虑。为了方便起见,最好使用一个元组(表示比较中最重要的字段是
,但如果它们相同,则应考虑
名称
),如下所示:

struct SomeNum{
名称:String,
值:u32,
}
请求某物{
fn cmp(&self,其他:&self)->订购{
(self.value和self.name).cmp(&(other.value和other.name))
}
}
对SomeNum的impl PartialOrd{
fn部分\u cmp(&self,其他:&self)->选项{
一些(self.cmp(其他))
}
}
SomeNum的impl PartialEq{
fn eq(&self,其他:&self)->bool{
(self.value和self.name)==(other.value和other.name)
}
}
SomeNum{}的impl Eq
如果您是这样做的,那么您最好对字段重新排序,并使用
#[派生]

#[派生(PartialEq、Eq、PartialOrd、Ord)]
结构SomeNum{
值:u32,
名称:String,
}

这将扩展到基本相同的内容。

谢谢!还有一件事。如果我想手动计算cmp,我会返回什么来表示更大、更小或相等。我尝试过执行上述操作,并在适当的时候返回Ordering::Less、Ordering::Greater和Ordering::Equal,但编译器声明cmp需要输出类型()而不是core::cmp::Ordering。这似乎只发生在if语句中出现的越来越少的情况下哦,是的,您想要的是
if size1size2{Ordering::Greater}else{Ordering::Equal}
如果
表达式有一个类型,那么实际上一行中有三个语句,前两个语句的值没有被使用,并且它们的类型也不一致,因为它们有一个隐式的
else{}
,类型为
()
。我看到了一个与此类似的问题,但-找到这些问题后,请包含指向这些问题的链接。这使得回答者能够更好地理解你已经读过的那些没有意义的解释,否则我们就有可能重复你已经知道的事情,浪费每个人的时间!这对未来的搜索者来说也很好,因为他们可以很容易地找到相关的问题。
impl Ord for SomeNum where SomeNum: PartialOrd + PartialEq + Eq {...}