Я работаю над проектом ржавчины, который в значительной степени опирается на операторы сопоставления. Исчерпывающее сопоставление в 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 или других способах проверки/обеспечения отсутствия условий отдыха в операторах сопоставления, но ничего не нашел. Я также не смог найти четкого названия для этих условий — я называю их «условиями покоя», но не нашел официального словаря ржавчины для таких случаев. Незнание более широко используемого термина могло также повредить моим возможностям поиска.
Да. Вы можете обеспечить это, включив 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)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^