Вы делаете это точно так же, как вы перегружаете оператор для структуры: реализуете соответствующую черту std::ops
.
Однако вы не хотите перегружать значение <
, вы все равно хотите выполнить сравнение.
Если вы запускаете набранный код, компилятор говорит вам, что делать :
error[E0369]: binary operation `<` cannot be applied to type `Numbers`
--> src/main.rs:6:13
|
6 | let a = Numbers::A < 4;
| ^^^^^^^^^^^^^^
|
= note: an implementation of `std::cmp::PartialOrd` might be missing for `Numbers`
Итак, внедрить PartialOrd
:
#[derive(Copy, Clone)]
enum Numbers {
A = 1,
}
use std::cmp::Ordering;
impl PartialEq<i32> for Numbers {
fn eq(&self, other: &i32) -> bool {
(*self as i32).eq(other)
}
}
impl PartialOrd<i32> for Numbers {
fn partial_cmp(&self, other: &i32) -> Option<Ordering> {
(*self as i32).partial_cmp(other)
}
}
fn main() {
let a = Numbers::A < 4;
}
Как Свен Марнах указывает на :
Возможно, стоит отметить, что эта реализация позволяет сравнивать только с Numbers
с левой стороны и i32
с правой стороны. Сравнения типа 4 > Numbers::A
и Numbers.A < Numbers.B
потребуют отдельных реализаций. Кроме того, поскольку вы имеете дело с целыми числами, вам также нужно реализовать Ord
и Eq
, поэтому для всех комбинаций операндов вы получите двенадцать реализаций признаков.
Конечно, это зависит от ваших конкретных случаев:
- если вы хотите сравнить
Numbers
с Numbers
, вы можете # [получить (PartialOrd)].
- если вы хотите
Eq
, вы можете получить его.
- вы можете писать макросы для уменьшения избыточности.
Смотри также: