PartialEq
介绍
pub trait PartialEq<Rhs = Self>
where
Rhs: ?Sized,
{
// Required method,后文有讲解这个注释
fn eq(&self, other: &Rhs) -> bool;
// Provided method,后文有讲解这个注释
fn ne(&self, other: &Rhs) -> bool {
... }
}
x.eq(y) can also be written x == y
x.ne(y) can be written x != y
a!=b if and only if !(a==b)
对于不具有完全等价关系type,此trait允许部分相等(This trait allows for partial equality, for types that do not have a full equivalence relation)。
例如,在浮点数(floating point numbers)中 NaN != NaN,因此浮点类型实现 PartialEq 但不实现 Eq。
Formally speaking正式来说,当Rhs==Self时,这个特质对应于部分等价关系(hen Rhs == Self, this trait corresponds to a partial equivalence relation)。
如果Self和Rhs也实现了PartialOrd或Ord,那么它们的方法必须与PartialEq一致。
通过派生一些特征并手动实现其他特征,很容易意外地让他们产生不同意见。
等式关系equality relation,必须满足以下条件(对于 A、B、C 类型的所有 a、b、c):
对称Symmetric:
如果 A: PartialEq<B> 和 B: PartialEq<A>
则a==b 意味着b==a
传递Transitive:
如果 A: PartialEq<B> 和 B: PartialEq<C> 和 A: PartialEq<C>
则a==b 且 b==c 意味着 a==c
注意
B: PartialEq<A>(对称)和 A: PartialEq<C>(传递)实现并不强制存在
但只要它们确实存在,这些要求就适用
此trait可以与#[derive] 一起使用
- 当在structs上派生时,如果所有字段都相等,则两个实例相等;如果任何字段不相等,则两个实例不相等。
- 当基于枚举派生时,如果两个实例是相同的变体并且所有字段都相等,则它们相等。
示例
两个相同类型的比较文章来源:https://www.toymoban.com/news/detail-721448.html
enum BookFormat {
Paperback,
Hardback,
Ebook,
}
struct Book {
isbn: i32,
format: BookFormat,
}
impl PartialEq for Book {
fn eq(&self, other: &Self) -> bool {
self.isbn == other.isbn
}
}
fn main() {
let b1 = Book {
isbn: 3, format: BookFormat::Paperback };
let b2 = Book {
isbn: 3, format: BookFormat::Ebook };
let b3 = Book {
isbn: 10, format: BookFormat::Paperback };
assert!(b1 == b2);
assert!(b1 != b3);
}
两个不同类型的比较文章来源地址https://www.toymoban.com/news/detail-721448.html
// The derive implements <BookFormat> == <BookFormat> comparisons
#[derive(PartialEq)]
enum BookFormat {
Paperback,
Hardback,
Ebook,
}
struct Book {
isbn: i32,
format: BookFormat,
}
// 实现 <Book> == <BookFormat> 比较,注意先后顺序
impl PartialEq<
到了这里,关于rust学习-trait std::cmp::PartialEq、Eq、PartialOrd、Ord的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!