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 {...}