Как я могу пропустить звонок, чтобы написать! когда образец соответствует fmt :: Display? - PullRequest
0 голосов
/ 30 апреля 2018

Рассмотрим следующее перечисление:

enum SomeEnum { A, B, C }

И следующая fmt::Display реализация:

impl fmt::Display for SomeEnum {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        use SomeEnum::*;

        match *self {
            A => write!(f, "A"),
            B => write!(f, "B"),
            // I'm not interested in calling write! for C
        }
    }
}

Можно ли пропустить вызов функции write! для одного конкретного значения перечисления (в данном случае C) при сопоставлении с образцом?

1 Ответ

0 голосов
/ 30 апреля 2018

Поскольку тип возвращаемого значения fmt равен fmt::Result, вам просто нужно указать пустое значение Ok(()), чтобы все возможные возвращаемые значения match имели одинаковый тип (и код для компиляции). :

impl fmt::Display for SomeEnum {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        use SomeEnum::*;

        match *self {
            A => write!(f, "A"),
            B => write!(f, "B"),
            C => Ok(()),
        }
    }
}

Альтернативой может быть использование C => unreachable!(), но это хорошая идея, только если вы уверены, что значение никогда не нужно будет Display ed (иначе это вызовет панику).

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