From: Stjepan Glavina Date: Sat, 27 May 2017 15:00:11 +0000 (+0200) Subject: Docs: impls of PartialEq/PartialOrd/Ord must agree X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=f5421367a2d72d5da415d2bbf97538099ff3ade0;p=rust.git Docs: impls of PartialEq/PartialOrd/Ord must agree --- diff --git a/src/libcollections/binary_heap.rs b/src/libcollections/binary_heap.rs index a5a2f70492d..0094804631b 100644 --- a/src/libcollections/binary_heap.rs +++ b/src/libcollections/binary_heap.rs @@ -42,8 +42,11 @@ //! // instead of a max-heap. //! impl Ord for State { //! fn cmp(&self, other: &State) -> Ordering { -//! // Notice that the we flip the ordering here +//! // Notice that the we flip the ordering on costs. +//! // In case of a tie we compare positions - this step is necessary +//! // to make implementations of `PartialEq` and `Ord` consistent. //! other.cost.cmp(&self.cost) +//! .then_with(|| self.position.cmp(&other.position)) //! } //! } //! diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index cc066099cf8..d523e40b49e 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -67,6 +67,10 @@ /// the rule that `eq` is a strict inverse of `ne`; that is, `!(a == b)` if and /// only if `a != b`. /// +/// Implementations of `PartialEq`, `PartialOrd`, and `Ord` *must* agree with +/// each other. It's easy to accidentally make them disagree by deriving some +/// of the traits and manually implementing others. +/// /// An example implementation for a domain in which two books are considered /// the same book if their ISBN matches, even if the formats differ: /// @@ -343,6 +347,10 @@ pub fn then_with Ordering>(self, f: F) -> Ordering { /// Then you must define an implementation for `cmp()`. You may find it useful to use /// `cmp()` on your type's fields. /// +/// Implementations of `PartialEq`, `PartialOrd`, and `Ord` *must* agree with each other. It's +/// easy to accidentally make them disagree by deriving some of the traits and manually +/// implementing others. +/// /// Here's an example where you want to sort people by height only, disregarding `id` /// and `name`: /// @@ -431,8 +439,8 @@ fn partial_cmp(&self, other: &Ordering) -> Option { /// /// ## How can I implement `PartialOrd`? /// -/// PartialOrd only requires implementation of the `partial_cmp` method, with the others generated -/// from default implementations. +/// `PartialOrd` only requires implementation of the `partial_cmp` method, with the others +/// generated from default implementations. /// /// However it remains possible to implement the others separately for types which do not have a /// total order. For example, for floating point numbers, `NaN < 0 == false` and `NaN >= 0 == @@ -440,6 +448,10 @@ fn partial_cmp(&self, other: &Ordering) -> Option { /// /// `PartialOrd` requires your type to be `PartialEq`. /// +/// Implementations of `PartialEq`, `PartialOrd`, and `Ord` *must* agree with each other. It's +/// easy to accidentally make them disagree by deriving some of the traits and manually +/// implementing others. +/// /// If your type is `Ord`, you can implement `partial_cmp()` by using `cmp()`: /// /// ```