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 的 ltlegtge 方法可以分别使用 <<=>>= 相互调用。

这个 trait 的方法必须相互一致,并且与 PartialEq 的方法一致。 必须满足以下条件:

  1. a == b 当且仅当 partial_cmp(a, b) == Some(Equal)
  2. a < b 当且仅当 partial_cmp(a, b) == Some(Less)
  3. a > b 当且仅当 partial_cmp(a, b) == Some(Greater)
  4. a <= b 当且仅当 a < b || a == b
  5. a >= b 当且仅当 a > b || a == b
  6. a != b 当且仅当 !(a == b)

上述条件 2-5 由默认实现保证。 PartialEq 已经保证了条件 6。

如果 Ord 也为 SelfRhs 实现,它也必须与 partial_cmp 一致 (具体要求请参见 trait 的文档)。 通过派生一些 traits 并手动实现其他一些行为,很容易使它们不以为然。

对于所有 abc,比较必须满足:

  • 可传递性: a < bb < 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 时,它将基于结构体成员的自上而下的声明顺序生成 词典 顺序。

当在枚举上 derived 时,变体按其判别式排序。 默认情况下,对于顶部的变体,判别式最小,底部变体的判别式最大。下面是一个例子:

#[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 == falseNaN >= 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
    }
}
Run

Examples

let x: u32 = 0;
let y: u32 = 1;

assert_eq!(x < y, true);
assert_eq!(x.lt(&y), true);
Run

Required Methods§

source

fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>

如果存在,则此方法返回 selfother 值之间的顺序。

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);
Run

Provided Methods§

source

fn lt(&self, other: &Rhs) -> bool

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。

Examples
assert_eq!(1.0 < 1.0, false);
assert_eq!(1.0 < 2.0, true);
assert_eq!(2.0 < 1.0, false);
Run
source

fn le(&self, other: &Rhs) -> bool

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。

Examples
assert_eq!(1.0 <= 1.0, true);
assert_eq!(1.0 <= 2.0, true);
assert_eq!(2.0 <= 1.0, false);
Run
source

fn gt(&self, other: &Rhs) -> bool

此方法测试大于 (对于 selfother),并且由 > 操作员使用。

Examples
assert_eq!(1.0 > 1.0, false);
assert_eq!(1.0 > 2.0, false);
assert_eq!(2.0 > 1.0, true);
Run
source

fn ge(&self, other: &Rhs) -> bool

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。

Examples
assert_eq!(1.0 >= 1.0, true);
assert_eq!(1.0 >= 2.0, false);
assert_eq!(2.0 >= 1.0, true);
Run

Implementors§

source§

impl PartialOrd<AsciiChar> for AsciiChar

1.34.0 · source§

impl PartialOrd<Infallible> for Infallible

1.7.0 · source§

impl PartialOrd<IpAddr> for IpAddr

1.16.0 · source§

impl PartialOrd<IpAddr> for Ipv4Addr

1.16.0 · source§

impl PartialOrd<IpAddr> for Ipv6Addr

source§

impl PartialOrd<SocketAddr> for SocketAddr

source§

impl PartialOrd<Which> for Which

source§

impl PartialOrd<Ordering> for Ordering

source§

impl PartialOrd<bool> for bool

source§

impl PartialOrd<char> for char

source§

impl PartialOrd<f32> for f32

source§

impl PartialOrd<f64> for f64

source§

impl PartialOrd<i8> for i8

source§

impl PartialOrd<i16> for i16

source§

impl PartialOrd<i32> for i32

source§

impl PartialOrd<i64> for i64

source§

impl PartialOrd<i128> for i128

source§

impl PartialOrd<isize> for isize

source§

impl PartialOrd<!> for !

source§

impl PartialOrd<str> for str

对字符串执行比较操作。

按字典顺序 通过字符串的字节值对字符串进行比较。 这将根据 Unicode 代码点在代码表中的位置进行比较。 这不一定与 “alphabetical” 顺序相同,后者因语言和区域设置而异。 根据文化认可的标准比较字符串需要特定于语言环境的数据,该数据不在 str 类型的作用域之内。

source§

impl PartialOrd<u8> for u8

source§

impl PartialOrd<u16> for u16

source§

impl PartialOrd<u32> for u32

source§

impl PartialOrd<u64> for u64

source§

impl PartialOrd<u128> for u128

source§

impl PartialOrd<()> for ()

source§

impl PartialOrd<usize> for usize

source§

impl PartialOrd<TypeId> for TypeId

1.27.0 · source§

impl PartialOrd<CpuidResult> for CpuidResult

Available on x86 or x86-64 only.
source§

impl PartialOrd<CStr> for CStr

source§

impl PartialOrd<Error> for Error

1.33.0 · source§

impl PartialOrd<PhantomPinned> for PhantomPinned

1.16.0 · source§

impl PartialOrd<Ipv4Addr> for IpAddr

source§

impl PartialOrd<Ipv4Addr> for Ipv4Addr

1.16.0 · source§

impl PartialOrd<Ipv6Addr> for IpAddr

source§

impl PartialOrd<Ipv6Addr> for Ipv6Addr

1.45.0 · source§

impl PartialOrd<SocketAddrV4> for SocketAddrV4

1.45.0 · source§

impl PartialOrd<SocketAddrV6> for SocketAddrV6

1.34.0 · source§

impl PartialOrd<NonZeroI8> for NonZeroI8

1.34.0 · source§

impl PartialOrd<NonZeroI16> for NonZeroI16

1.34.0 · source§

impl PartialOrd<NonZeroI32> for NonZeroI32

1.34.0 · source§

impl PartialOrd<NonZeroI64> for NonZeroI64

1.34.0 · source§

impl PartialOrd<NonZeroI128> for NonZeroI128

1.34.0 · source§

impl PartialOrd<NonZeroIsize> for NonZeroIsize

1.28.0 · source§

impl PartialOrd<NonZeroU8> for NonZeroU8

1.28.0 · source§

impl PartialOrd<NonZeroU16> for NonZeroU16

1.28.0 · source§

impl PartialOrd<NonZeroU32> for NonZeroU32

1.28.0 · source§

impl PartialOrd<NonZeroU64> for NonZeroU64

1.28.0 · source§

impl PartialOrd<NonZeroU128> for NonZeroU128

1.28.0 · source§

impl PartialOrd<NonZeroUsize> for NonZeroUsize

const: unstable · source§

impl PartialOrd<Alignment> for Alignment

1.3.0 · source§

impl PartialOrd<Duration> for Duration

1.10.0 · source§

impl<'a> PartialOrd<Location<'a>> for Location<'a>

source§

impl<A, B: ?Sized> PartialOrd<&B> for &Awhere A: PartialOrd<B> + ?Sized,

source§

impl<A, B: ?Sized> PartialOrd<&mut B> for &mut Awhere A: PartialOrd<B> + ?Sized,

source§

impl<Dyn: ?Sized> PartialOrd<DynMetadata<Dyn>> for DynMetadata<Dyn>

1.4.0 · source§

impl<F: FnPtr> PartialOrd<F> for F

1.41.0 · source§

impl<P: Deref, Q: Deref> PartialOrd<Pin<Q>> for Pin<P>where P::Target: PartialOrd<Q::Target>,

source§

impl<T> PartialOrd<(T,)> for (T₁, T₂, …, Tₙ)where T: ?Sized + PartialOrd,

This trait is implemented for tuples up to twelve items long.

source§

impl<T, const LANES: usize> PartialOrd<Mask<T, LANES>> for Mask<T, LANES>where T: MaskElement + PartialOrd, LaneCount<LANES>: SupportedLaneCount,

source§

impl<T, const N: usize> PartialOrd<Simd<T, N>> for Simd<T, N>where LaneCount<N>: SupportedLaneCount, T: SimdElement + PartialOrd,

1.10.0 · source§

impl<T: PartialOrd + Copy> PartialOrd<Cell<T>> for Cell<T>

1.20.0 · source§

impl<T: PartialOrd + ?Sized> PartialOrd<ManuallyDrop<T>> for ManuallyDrop<T>

source§

impl<T: PartialOrd> PartialOrd<Option<T>> for Option<T>

1.36.0 · source§

impl<T: PartialOrd> PartialOrd<Poll<T>> for Poll<T>

source§

impl<T: PartialOrd> PartialOrd<[T]> for [T]

实现 vectors 按字典顺序 的比较。

source§

impl<T: PartialOrd> PartialOrd<Saturating<T>> for Saturating<T>

source§

impl<T: PartialOrd> PartialOrd<Wrapping<T>> for Wrapping<T>

1.19.0 · source§

impl<T: PartialOrd> PartialOrd<Reverse<T>> for Reverse<T>

source§

impl<T: PartialOrd, E: PartialOrd> PartialOrd<Result<T, E>> for Result<T, E>

source§

impl<T: PartialOrd, const N: usize> PartialOrd<[T; N]> for [T; N]

1.10.0 · source§

impl<T: ?Sized + PartialOrd> PartialOrd<RefCell<T>> for RefCell<T>

source§

impl<T: ?Sized> PartialOrd<*const T> for *const T

source§

impl<T: ?Sized> PartialOrd<*mut T> for *mut T

source§

impl<T: ?Sized> PartialOrd<PhantomData<T>> for PhantomData<T>

1.25.0 · source§

impl<T: ?Sized> PartialOrd<NonNull<T>> for NonNull<T>

source§

impl<Y: PartialOrd, R: PartialOrd> PartialOrd<GeneratorState<Y, R>> for GeneratorState<Y, R>