Trait core::cmp::PartialOrd
1.0.0 · source · pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
// Required method
fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>;
// Provided methods
fn lt(&self, other: &Rhs) -> bool { ... }
fn le(&self, other: &Rhs) -> bool { ... }
fn gt(&self, other: &Rhs) -> bool { ... }
fn ge(&self, other: &Rhs) -> bool { ... }
}
Expand description
一个用于形成 [部分顺序]partial order 的类型的 trait。
此 trait 的 lt
、le
、gt
和 ge
方法可以分别使用 <
、<=
、>
和 >=
相互调用。
这个 trait 的方法必须相互一致,并且与 PartialEq
的方法一致。
必须满足以下条件:
a == b
当且仅当partial_cmp(a, b) == Some(Equal)
。a < b
当且仅当partial_cmp(a, b) == Some(Less)
a > b
当且仅当partial_cmp(a, b) == Some(Greater)
a <= b
当且仅当a < b || a == b
a >= b
当且仅当a > b || a == b
a != b
当且仅当!(a == b)
。
上述条件 2-5 由默认实现保证。
PartialEq
已经保证了条件 6。
如果 Ord
也为 Self
和 Rhs
实现,它也必须与 partial_cmp
一致 (具体要求请参见 trait 的文档)。
通过派生一些 traits 并手动实现其他一些行为,很容易使它们不以为然。
对于所有 a
,b
和 c
,比较必须满足:
- 可传递性:
a < b
和b < c
表示a < c
。==
和>
必须保持相同。 - 二元性:
a < b
当且仅当b > a
。
请注意,这些要求意味着 trait 本身必须对称且可传递地实现:如果 T: PartialOrd<U>
和 U: PartialOrd<V>
,则 U: PartialOrd<T>
和 T: PartialOrd<V>
。
Corollaries
从上述要求得出以下推论:
<
和>
的非反射性:!(a < a)
、!(a > a)
>
的传递性:如果a > b
并且b > c
,则a > c
partial_cmp
的对偶性:partial_cmp(a, b) == partial_cmp(b, a).map(Ordering::reverse)
Derivable
该 trait 可以与 #[derive]
一起使用。
在结构体上 derive
d 时,它将基于结构体成员的自上而下的声明顺序生成 词典 顺序。
当在枚举上 derive
d 时,变体按其判别式排序。
默认情况下,对于顶部的变体,判别式最小,底部变体的判别式最大。下面是一个例子:
#[derive(PartialEq, PartialOrd)]
enum E {
Top,
Bottom,
}
assert!(E::Top < E::Bottom);
Run但是,手动设置判别式可以覆盖此默认行为:
#[derive(PartialEq, PartialOrd)]
enum E {
Top = 2,
Bottom = 1,
}
assert!(E::Bottom < E::Top);
Run如何实现 PartialOrd
?
PartialOrd
只需要实现 partial_cmp
方法,其他方法从默认实现中生成。
但是,对于没有总顺序的类型,仍然可以单独实现其他类型。例如,对于浮点数,NaN < 0 == false
和 NaN >= 0 == false
(参见
IEEE 754-2008 第 5.11 节)。
PartialOrd
要求您的类型为 PartialEq
。
如果您的类型是 Ord
,则可以使用 cmp
来实现 partial_cmp
:
use std::cmp::Ordering;
#[derive(Eq)]
struct Person {
id: u32,
name: String,
height: u32,
}
impl PartialOrd for Person {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Person {
fn cmp(&self, other: &Self) -> Ordering {
self.height.cmp(&other.height)
}
}
impl PartialEq for Person {
fn eq(&self, other: &Self) -> bool {
self.height == other.height
}
}
Run您可能还会发现在类型的字段上使用 partial_cmp
很有用。这是 Person
类型的示例,它们具有一个浮点 height
字段,该字段是唯一用于排序的字段:
use std::cmp::Ordering;
struct Person {
id: u32,
name: String,
height: f64,
}
impl PartialOrd for Person {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.height.partial_cmp(&other.height)
}
}
impl PartialEq for Person {
fn eq(&self, other: &Self) -> bool {
self.height == other.height
}
}
RunExamples
let x: u32 = 0;
let y: u32 = 1;
assert_eq!(x < y, true);
assert_eq!(x.lt(&y), true);
RunRequired Methods§
sourcefn partial_cmp(&self, other: &Rhs) -> Option<Ordering>
fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>
如果存在,则此方法返回 self
和 other
值之间的顺序。
Examples
use std::cmp::Ordering;
let result = 1.0.partial_cmp(&2.0);
assert_eq!(result, Some(Ordering::Less));
let result = 1.0.partial_cmp(&1.0);
assert_eq!(result, Some(Ordering::Equal));
let result = 2.0.partial_cmp(&1.0);
assert_eq!(result, Some(Ordering::Greater));
Run如果无法进行比较:
let result = f64::NAN.partial_cmp(&1.0);
assert_eq!(result, None);
RunProvided Methods§
Implementors§
impl PartialOrd<AsciiChar> for AsciiChar
impl PartialOrd<Infallible> for Infallible
impl PartialOrd<IpAddr> for IpAddr
impl PartialOrd<IpAddr> for Ipv4Addr
impl PartialOrd<IpAddr> for Ipv6Addr
impl PartialOrd<SocketAddr> for SocketAddr
impl PartialOrd<Which> for Which
impl PartialOrd<Ordering> for Ordering
impl PartialOrd<bool> for bool
impl PartialOrd<char> for char
impl PartialOrd<f32> for f32
impl PartialOrd<f64> for f64
impl PartialOrd<i8> for i8
impl PartialOrd<i16> for i16
impl PartialOrd<i32> for i32
impl PartialOrd<i64> for i64
impl PartialOrd<i128> for i128
impl PartialOrd<isize> for isize
impl PartialOrd<!> for !
impl PartialOrd<str> for str
对字符串执行比较操作。
按字典顺序 通过字符串的字节值对字符串进行比较。
这将根据 Unicode 代码点在代码表中的位置进行比较。
这不一定与 “alphabetical” 顺序相同,后者因语言和区域设置而异。
根据文化认可的标准比较字符串需要特定于语言环境的数据,该数据不在 str
类型的作用域之内。
impl PartialOrd<u8> for u8
impl PartialOrd<u16> for u16
impl PartialOrd<u32> for u32
impl PartialOrd<u64> for u64
impl PartialOrd<u128> for u128
impl PartialOrd<()> for ()
impl PartialOrd<usize> for usize
impl PartialOrd<TypeId> for TypeId
impl PartialOrd<CpuidResult> for CpuidResult
impl PartialOrd<CStr> for CStr
impl PartialOrd<Error> for Error
impl PartialOrd<PhantomPinned> for PhantomPinned
impl PartialOrd<Ipv4Addr> for IpAddr
impl PartialOrd<Ipv4Addr> for Ipv4Addr
impl PartialOrd<Ipv6Addr> for IpAddr
impl PartialOrd<Ipv6Addr> for Ipv6Addr
impl PartialOrd<SocketAddrV4> for SocketAddrV4
impl PartialOrd<SocketAddrV6> for SocketAddrV6
impl PartialOrd<NonZeroI8> for NonZeroI8
impl PartialOrd<NonZeroI16> for NonZeroI16
impl PartialOrd<NonZeroI32> for NonZeroI32
impl PartialOrd<NonZeroI64> for NonZeroI64
impl PartialOrd<NonZeroI128> for NonZeroI128
impl PartialOrd<NonZeroIsize> for NonZeroIsize
impl PartialOrd<NonZeroU8> for NonZeroU8
impl PartialOrd<NonZeroU16> for NonZeroU16
impl PartialOrd<NonZeroU32> for NonZeroU32
impl PartialOrd<NonZeroU64> for NonZeroU64
impl PartialOrd<NonZeroU128> for NonZeroU128
impl PartialOrd<NonZeroUsize> for NonZeroUsize
impl PartialOrd<Alignment> for Alignment
impl PartialOrd<Duration> for Duration
impl<'a> PartialOrd<Location<'a>> for Location<'a>
impl<A, B: ?Sized> PartialOrd<&B> for &Awhere A: PartialOrd<B> + ?Sized,
impl<A, B: ?Sized> PartialOrd<&mut B> for &mut Awhere A: PartialOrd<B> + ?Sized,
impl<Dyn: ?Sized> PartialOrd<DynMetadata<Dyn>> for DynMetadata<Dyn>
impl<F: FnPtr> PartialOrd<F> for F
impl<P: Deref, Q: Deref> PartialOrd<Pin<Q>> for Pin<P>where P::Target: PartialOrd<Q::Target>,
impl<T> PartialOrd<(T,)> for (T₁, T₂, …, Tₙ)where T: ?Sized + PartialOrd,
This trait is implemented for tuples up to twelve items long.
impl<T, const LANES: usize> PartialOrd<Mask<T, LANES>> for Mask<T, LANES>where T: MaskElement + PartialOrd, LaneCount<LANES>: SupportedLaneCount,
impl<T, const N: usize> PartialOrd<Simd<T, N>> for Simd<T, N>where LaneCount<N>: SupportedLaneCount, T: SimdElement + PartialOrd,
impl<T: PartialOrd + Copy> PartialOrd<Cell<T>> for Cell<T>
impl<T: PartialOrd + ?Sized> PartialOrd<ManuallyDrop<T>> for ManuallyDrop<T>
impl<T: PartialOrd> PartialOrd<Option<T>> for Option<T>
impl<T: PartialOrd> PartialOrd<Poll<T>> for Poll<T>
impl<T: PartialOrd> PartialOrd<[T]> for [T]
实现 vectors 按字典顺序 的比较。