Предотвращение состояния покоя в заявлении соответствия Rust

Я работаю над проектом ржавчины, который в значительной степени опирается на операторы сопоставления. Исчерпывающее сопоставление в Rust является одной из причин, по которой мы выбрали этот язык для работы, и мне любопытно, можно ли запретить совпадениям с перечислением включать условие отдыха _ => {} — скорее, мы хотим гарантировать, что каждое один оператор сопоставления соответствует каждому варианту перечисления. Это связано с тем, что варианты перечисления со временем будут расширяться по мере долгосрочного развития проекта, и мы хотим быть уверены, что каждый вариант всегда сопоставляется.

Например:

enum MyEnum {
    VariantA,
    VariantB,
    VariantC,
    VariantD,
}

impl MyEnum {
    fn some_method(&self) {
        match self {
            MyEnum::VariantA => todo!(),
            MyEnum::VariantB => todo!(),
            _ => todo!(),  // <-- DON'T ALLOW THIS
        }
    }
}

В настоящее время мы просто советуем никогда не использовать подобные условия отдыха, но нам интересно, есть ли способ обеспечить более тщательное соблюдение этого правила.

Я пытался найти информацию о макросах, расширениях VSCode или других способах проверки/обеспечения отсутствия условий отдыха в операторах сопоставления, но ничего не нашел. Я также не смог найти четкого названия для этих условий — я называю их «условиями покоя», но не нашел официального словаря ржавчины для таких случаев. Незнание более широко используемого термина могло также повредить моим возможностям поиска.

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
3
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да. Вы можете обеспечить это, включив wildcard_enum_match_arm lint Clippy. Например, следующий код:

#![deny(clippy::wildcard_enum_match_arm)]

enum MyEnum {
    VariantA,
    VariantB,
    VariantC,
    VariantD,
}

impl MyEnum {
    fn some_method(&self) {
        match self {
            MyEnum::VariantA => todo!(),
            MyEnum::VariantB => todo!(),
            _ => todo!(),  // <-- DON'T ALLOW THIS
        }
    }
}

Не удастся cargo clippy проверить со следующей ошибкой:

error: wildcard match will also match any future added variants
  --> src/lib.rs:15:13
   |
15 |             _ => todo!(),  // <-- DON'T ALLOW THIS
   |             ^ help: try: `MyEnum::VariantC | MyEnum::VariantD`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wildcard_enum_match_arm
note: the lint level is defined here
  --> src/lib.rs:1:9
   |
1  | #![deny(clippy::wildcard_enum_match_arm)]
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Другие вопросы по теме