Как сделать перегрузку операторов на перечислениях? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть перечисление:

enum Numbers {
    A = 1,
}

Как я могу перегрузить оператор, чтобы я мог сравнить перечисление Numbers с другим стандартным числом без необходимости делать as u32? Если я хочу сделать:

let a = Numbers::A < 4

Мне кажется, я где-то читал, что можно делать с какими-то макросами? Может быть, есть ящик, который позволяет мне сделать это? Пока что единственное, с чем я добился успеха, это as u32, но довольно утомительно каждый раз писать об этом.

1 Ответ

0 голосов
/ 30 октября 2018

Вы делаете это точно так же, как вы перегружаете оператор для структуры: реализуете соответствующую черту 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, вы можете получить его.
  • вы можете писать макросы для уменьшения избыточности.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...