Трейт Ord
Трейт Ord представляет полное упорядочение
для типа. Он позволяет сравнивать значения
с помощью операторов <, >,
<= и >=. Трейт Ord
является подтрейтом PartialOrd и
Eq, поэтому тип, реализующий
Ord, обязан также реализовывать
PartialOrd, Eq и
PartialEq. Метод cmp принимает
ссылку на другое значение того же типа
и возвращает значение перечисления
Ordering: Less, Equal
или Greater.
Синтаксис
impl Ord for Type
{
fn cmp(&self, other: &Self) -> Ordering
{
// ...
}
}
Пример
Давайте сравним два числа с помощью метода
cmp:
use std::cmp::Ordering;
fn main()
{
let a = 5;
let b = 10;
let res = a.cmp(&b);
match res
{
Ordering::Less => println!("Less"),
Ordering::Equal => println!("Equal"),
Ordering::Greater => println!("Greater"),
}
}
Результат выполнения кода:
Less
Пример
Давайте отсортируем вектор чисел. Метод
sort использует трейт Ord
для упорядочивания элементов:
fn main()
{
let mut vec = vec![3, 1, 4, 1, 5, 9, 2, 6];
vec.sort();
println!("{:?}", vec);
}
Результат выполнения кода:
[1, 1, 2, 3, 4, 5, 6, 9]
Пример
Давайте реализуем трейт Ord для
собственной структуры Point
и сравним две точки:
use std::cmp::Ordering;
#[derive(Debug, PartialEq, Eq)]
struct Point
{
x: i32,
y: i32,
}
impl PartialOrd for Point
{
fn partial_cmp(&self, other: &Self) -> Option<Ordering>
{
Some(self.cmp(other))
}
}
impl Ord for Point
{
fn cmp(&self, other: &Self) -> Ordering
{
(self.x, self.y).cmp(&(other.x, other.y))
}
}
fn main()
{
let p1 = Point { x: 1, y: 2 };
let p2 = Point { x: 3, y: 4 };
let res = p1.cmp(&p2);
match res
{
Ordering::Less => println!("Less"),
Ordering::Equal => println!("Equal"),
Ordering::Greater => println!("Greater"),
}
}
Результат выполнения кода:
Less
Смотрите также
-
трейт
PartialOrd,
который задаёт частичное упорядочение -
трейт
Eq,
который задаёт отношение эквивалентности -
трейт
PartialEq,
который позволяет сравнивать значения на равенство -
трейт
Hash,
который позволяет хешировать значения