Трейт PartialEq
Трейт PartialEq определяет возможность
сравнения двух значений на равенство. Он
предоставляет методы eq и ne,
которые лежат в основе операторов ==
и != соответственно. Параметром метод
eq принимает ссылку на другое значение
того же типа, с которым происходит сравнение,
и возвращает true, если значения равны,
и false в противном случае.
Трейт PartialEq называется частичным,
потому что для некоторых типов (например,
с плавающей точкой f64) равенство
может не выполняться для значения NaN:
NaN != NaN возвращает true.
Для полного равенства, которое подчиняется
рефлексивности, используется трейт Eq.
Синтаксис
trait PartialEq<Rhs = Self>
{
fn eq(&self, other: &Rhs) -> bool;
fn ne(&self, other: &Rhs) -> bool { ... }
}
Пример
Давайте сравним два числа с помощью оператора
==:
fn main()
{
let a = 5;
let b = 5;
let res = a == b;
println!("{}", res);
}
Результат выполнения кода:
true
Пример
Давайте сравним две строки с помощью оператора
!=:
fn main()
{
let a = "abcde";
let b = "12345";
let res = a != b;
println!("{}", res);
}
Результат выполнения кода:
true
Пример
Давайте реализуем трейт PartialEq
для собственной структуры Point
и сравним две точки:
struct Point
{
x: i32,
y: i32,
}
impl PartialEq for Point
{
fn eq(&self, other: &Self) -> bool
{
self.x == other.x && self.y == other.y
}
}
fn main()
{
let p1 = Point { x: 1, y: 2 };
let p2 = Point { x: 1, y: 2 };
let res = p1 == p2;
println!("{}", res);
}
Результат выполнения кода:
true
Пример
Давайте проверим поведение PartialEq
для специального значения NaN:
fn main()
{
let a = f64::NAN;
let res = a == a;
println!("{}", res);
}
Результат выполнения кода:
false
Смотрите также
-
трейт
Eq,
который задаёт полное равенство без исключений -
трейт
PartialOrd,
который позволяет сравнивать значения по порядку -
трейт
Hash,
который хеширует значения для использования в коллекциях -
трейт
trait,
который описывает общий синтаксис объявления трейтов