PartialEq 特性
PartialEq 提供了对部分相等性的支持。实现了 PartialEq 特性的类型可以使用 == 和 != 操作符来进行比较。这是一个基础的特性,用于检查两个值是否相等或不相等。
Eq 是 PartialEq 的一个子集,或者说是更严格的等价特性。它表示完全相等.如果一个类型实现了 Eq 特性,它也必须实现 PartialEq 特性。
自定义的是否相等的逻辑, Eq 使用标记的。
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
impl PartialEq for Point {
fn eq(&self, other: &Self) -> bool {
self.x == other.x && self.y == other.y
}
}
// Eq 的实现就是一个空实现,因为所有方法和逻辑已经在 PartialEq 中定义。
impl Eq for Point {}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = Point { x: 1, y: 2 };
let p3 = Point { x: 2, y: 3 };
assert!(p1 == p2);
assert!(p1 != p3);
println!("{:?} and {:?} are equal: {}", p1, p2, p1 == p2);
println!("{:?} and {:?} are equal: {}", p1, p3, p1 == p3);
}
不是所有的都是实现了eq
Rust 标准库中 f32 和 f64 类型仅实现了 PartialEq,而没有实现 Eq
let nan = std::f32::NAN;
assert!(nan != nan); // 输出: true
PartialOrd 特性
PartialOrd 提供了对部分排序性的支持。实现了 PartialOrd 特性的类型可以使用 <, <=, >, 和 >= 操作符进行比较。与 Ord 特性不同, PartialOrd 允许部分有序关系,例如浮点数中的NaN情况。
Ord 是 PartialOrd 的一个子集,表示完全排序,没有特殊情况(例如NaN)。如果一个类型实现了 Ord 特性,它也必须实现 PartialOrd 、 Eq 和 PartialEq 特性。 Ord 特性要求提供一个通用的比较方法 cmp ,该方法返回 Ordering 枚举,表示小于、大于或等于关系。
PartialOrd 特性依赖 PartialEq 特性,因此你需要先为类型实现 PartialEq。
如果一个类型实现了 Ord,它必须同时实现 PartialOrd、Eq 和 PartialEq。
impl PartialOrd for Point {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
if self.x == other.x {
Some(self.y.cmp(&other.y))
} else {
Some(self.x.cmp(&other.x))
}
}
}
Hash 特性
必须实现 Eq 特性:为了确保相同的值具有相同的哈希码,类型必须实现 Eq 特性。
impl Hash for Point {
fn hash<H: Hasher>(&self, state: &mut H) {
// 将需要哈希的字段添加到 `state`
self.x.hash(state);
self.y.hash(state);
// 或者如果你希望自定义哈希逻辑,也可以这样:
// state.write_i32(self.x);
// state.write_i32(self.y);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。