Трейт PartialOrd
Трейт PartialOrd определяет частичный порядок
для типа. Он позволяет сравнивать значения
операторами <, >, <= и >=.
Метод partial_cmp принимает второе значение
того же типа и возвращает Option<Ordering>.
Трейт PartialOrd является надтрейтом
для PartialEq, поэтому тип должен также
реализовывать сравнение на равенство.
Значения возвращаемого типа Ordering означают
следующее: Less - первое значение меньше второго,
Equal - значения равны,
Greater - первое значение больше второго.
Метод возвращает None, если значения
несравнимы, например, когда одно из них NaN.
Синтаксис
trait PartialOrd<Rhs = Self>: PartialEq<Rhs>
{
fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>;
}
Основной метод трейта имеет такой синтаксис:
value.partial_cmp(&other)
Пример
Давайте сравним два числа с помощью метода partial_cmp:
use std::cmp::Ordering;
fn main()
{
let a = 5;
let b = 10;
let res = a.partial_cmp(&b);
match res
{
Some(Ordering::Less) => println!("a < b"),
Some(Ordering::Equal) => println!("a == b"),
Some(Ordering::Greater) => println!("a > b"),
None => println!("not comparable"),
}
}
Результат выполнения кода:
"a < b"
Пример
Операторы сравнения работают автоматически для типов,
реализующих трейт PartialOrd. Давайте сравним
две строки:
fn main()
{
let a = "abcde";
let b = "12345";
let res = a > b;
println!("{}", res);
}
Результат выполнения кода:
true
Пример
Давайте сравним два значения f64, одно из которых
равно NaN. Такое сравнение вернёт None:
fn main()
{
let a = f64::NAN;
let b = 1.0;
let res = a.partial_cmp(&b);
println!("{:?}", res);
}
Результат выполнения кода:
None
Пример
Давайте реализуем трейт PartialOrd для своей
структуры и сравним два её экземпляра:
use std::cmp::Ordering;
#[derive(PartialEq)]
struct Point
{
x: i32,
}
impl PartialOrd for Point
{
fn partial_cmp(&self, other: &Self) -> Option<Ordering>
{
self.x.partial_cmp(&other.x)
}
}
fn main()
{
let a = Point { x: 3 };
let b = Point { x: 7 };
let res = a < b;
println!("{}", res);
}
Результат выполнения кода:
true
Смотрите также
-
трейт
PartialEq,
который определяет сравнение на равенство -
трейт
Ord,
который задаёт полный порядок значений -
трейт
Eq,
который отмечает тип с полным равенством -
трейт
trait-bound,
который ограничивает обобщённые типы трейтами