如何为结构实现 Ord?
How do I implement Ord for a struct?
我见过一个与此类似的问题,但没有人确切地告诉我如何为结构实现 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
.
如果您愿意,可以使用 u32
上的 Ord
实现来提供帮助: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,
}
这将扩展为基本相同的东西。
我见过一个与此类似的问题,但没有人确切地告诉我如何为结构实现 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
.
如果您愿意,可以使用 u32
上的 Ord
实现来提供帮助: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,
}
这将扩展为基本相同的东西。