Trait std::cmp::PartialOrd
1.0.0 · source · pub trait PartialOrd<Rhs = Self>: PartialEq<Rhs>where
Rhs: ?Sized,{
// 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 == ba >= b当且仅当a > b || a == ba != 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 > cpartial_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 == 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<ErrorKind> for ErrorKind
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<str> for OsStr
impl PartialOrd<str> for OsString
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<CpuidResult> for CpuidResult
impl PartialOrd<TypeId> for TypeId
impl PartialOrd<CStr> for CStr
impl PartialOrd<CString> for CString
impl PartialOrd<OsStr> for OsStr
impl PartialOrd<OsStr> for Path
impl PartialOrd<OsStr> for PathBuf
impl PartialOrd<OsString> for OsString
impl PartialOrd<OsString> for Path
impl PartialOrd<OsString> for PathBuf
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<Path> for OsStr
impl PartialOrd<Path> for OsString
impl PartialOrd<Path> for Path
impl PartialOrd<Path> for PathBuf
impl PartialOrd<PathBuf> for OsStr
impl PartialOrd<PathBuf> for OsString
impl PartialOrd<PathBuf> for Path
impl PartialOrd<PathBuf> for PathBuf
impl PartialOrd<Alignment> for Alignment
impl PartialOrd<String> for String
impl PartialOrd<Duration> for Duration
impl PartialOrd<Instant> for Instant
impl PartialOrd<SystemTime> for SystemTime
impl<'a> PartialOrd<&'a OsStr> for Path
impl<'a> PartialOrd<&'a OsStr> for PathBuf
impl<'a> PartialOrd<&'a Path> for OsStr
impl<'a> PartialOrd<&'a Path> for OsString
impl<'a> PartialOrd<&'a Path> for PathBuf
impl<'a> PartialOrd<Cow<'a, OsStr>> for Path
impl<'a> PartialOrd<Cow<'a, OsStr>> for PathBuf
impl<'a> PartialOrd<Cow<'a, Path>> for OsStr
impl<'a> PartialOrd<Cow<'a, Path>> for OsString
impl<'a> PartialOrd<Cow<'a, Path>> for Path
impl<'a> PartialOrd<Cow<'a, Path>> for PathBuf
impl<'a> PartialOrd<Component<'a>> for Component<'a>
impl<'a> PartialOrd<Prefix<'a>> for Prefix<'a>
impl<'a> PartialOrd<OsStr> for &'a Path
impl<'a> PartialOrd<OsStr> for Cow<'a, Path>
impl<'a> PartialOrd<OsString> for &'a Path
impl<'a> PartialOrd<OsString> for Cow<'a, Path>
impl<'a> PartialOrd<Location<'a>> for Location<'a>
impl<'a> PartialOrd<Components<'a>> for Components<'a>
impl<'a> PartialOrd<Path> for &'a OsStr
impl<'a> PartialOrd<Path> for Cow<'a, OsStr>
impl<'a> PartialOrd<Path> for Cow<'a, Path>
impl<'a> PartialOrd<PathBuf> for &'a OsStr
impl<'a> PartialOrd<PathBuf> for &'a Path
impl<'a> PartialOrd<PathBuf> for Cow<'a, OsStr>
impl<'a> PartialOrd<PathBuf> for Cow<'a, Path>
impl<'a> PartialOrd<PrefixComponent<'a>> for PrefixComponent<'a>
impl<'a, 'b> PartialOrd<&'a OsStr> for OsString
impl<'a, 'b> PartialOrd<&'a Path> for Cow<'b, OsStr>
impl<'a, 'b> PartialOrd<&'b OsStr> for Cow<'a, OsStr>
impl<'a, 'b> PartialOrd<&'b OsStr> for Cow<'a, Path>
impl<'a, 'b> PartialOrd<&'b Path> for Cow<'a, Path>
impl<'a, 'b> PartialOrd<Cow<'a, OsStr>> for &'b OsStr
impl<'a, 'b> PartialOrd<Cow<'a, OsStr>> for OsStr
impl<'a, 'b> PartialOrd<Cow<'a, OsStr>> for OsString
impl<'a, 'b> PartialOrd<Cow<'a, Path>> for &'b OsStr
impl<'a, 'b> PartialOrd<Cow<'a, Path>> for &'b Path
impl<'a, 'b> PartialOrd<Cow<'b, OsStr>> for &'a Path
impl<'a, 'b> PartialOrd<OsStr> for Cow<'a, OsStr>
impl<'a, 'b> PartialOrd<OsStr> for OsString
impl<'a, 'b> PartialOrd<OsString> for &'a OsStr
impl<'a, 'b> PartialOrd<OsString> for Cow<'a, OsStr>
impl<'a, 'b> PartialOrd<OsString> for OsStr
impl<'a, B> PartialOrd<Cow<'a, B>> for Cow<'a, B>where B: PartialOrd<B> + ToOwned + ?Sized,
impl<A, B> PartialOrd<&B> for &Awhere A: PartialOrd<B> + ?Sized, B: ?Sized,
impl<A, B> PartialOrd<&mut B> for &mut Awhere A: PartialOrd<B> + ?Sized, B: ?Sized,
impl<Dyn> PartialOrd<DynMetadata<Dyn>> for DynMetadata<Dyn>where Dyn: ?Sized,
impl<F> PartialOrd<F> for Fwhere F: FnPtr,
impl<K, V, A> PartialOrd<BTreeMap<K, V, A>> for BTreeMap<K, V, A>where K: PartialOrd<K>, V: PartialOrd<V>, A: Allocator + Clone,
impl<P, Q> PartialOrd<Pin<Q>> for Pin<P>where P: Deref, Q: Deref, <P as Deref>::Target: PartialOrd<<Q as Deref>::Target>,
impl<T> PartialOrd<Option<T>> for Option<T>where T: PartialOrd<T>,
impl<T> PartialOrd<Poll<T>> for Poll<T>where T: PartialOrd<T>,
impl<T> PartialOrd<*const T> for *const Twhere T: ?Sized,
impl<T> PartialOrd<*mut T> for *mut Twhere T: ?Sized,
impl<T> PartialOrd<[T]> for [T]where T: PartialOrd<T>,
实现 vectors 按字典顺序 的比较。
impl<T> PartialOrd<(T,)> for (T₁, T₂, …, Tₙ)where T: PartialOrd<T> + ?Sized,
This trait is implemented for tuples up to twelve items long.
impl<T> PartialOrd<Cell<T>> for Cell<T>where T: PartialOrd<T> + Copy,
impl<T> PartialOrd<RefCell<T>> for RefCell<T>where T: PartialOrd<T> + ?Sized,
impl<T> PartialOrd<PhantomData<T>> for PhantomData<T>where T: ?Sized,
impl<T> PartialOrd<ManuallyDrop<T>> for ManuallyDrop<T>where T: PartialOrd<T> + ?Sized,
impl<T> PartialOrd<Saturating<T>> for Saturating<T>where T: PartialOrd<T>,
impl<T> PartialOrd<Wrapping<T>> for Wrapping<T>where T: PartialOrd<T>,
impl<T> PartialOrd<NonNull<T>> for NonNull<T>where T: ?Sized,
impl<T> PartialOrd<Rc<T>> for Rc<T>where T: PartialOrd<T> + ?Sized,
impl<T> PartialOrd<Arc<T>> for Arc<T>where T: PartialOrd<T> + ?Sized,
impl<T> PartialOrd<Reverse<T>> for Reverse<T>where T: PartialOrd<T>,
impl<T, A> PartialOrd<Box<T, A>> for Box<T, A>where T: PartialOrd<T> + ?Sized, A: Allocator,
impl<T, A> PartialOrd<BTreeSet<T, A>> for BTreeSet<T, A>where T: PartialOrd<T>, A: Allocator + Clone,
impl<T, A> PartialOrd<LinkedList<T, A>> for LinkedList<T, A>where T: PartialOrd<T>, A: Allocator,
impl<T, A> PartialOrd<VecDeque<T, A>> for VecDeque<T, A>where T: PartialOrd<T>, A: Allocator,
impl<T, A> PartialOrd<Vec<T, A>> for Vec<T, A>where T: PartialOrd<T>, A: Allocator,
实现 vectors、lexicographically 的比较。