При работе с перечислениями в
Rust часто возникает необходимость проверить, соответствует ли значение определенному варианту. Традиционный подход с
match избыточен для простых проверок, а сравнение через
if let не всегда легко читаемо и удобно. Сегодня разберем макрос
matches! - инструмент, который делает код чище и выразительнее.
Проблема - многословные проверки:
Допустим, у нас есть перечисление статусов пользователя:
enum UserStatus {
Active,
Inactive,
Suspended,
Banned,
}
Как проверить, активен ли пользователь:
Способ 1 - через match (избыточно):
let status = UserStatus::Active;
match status {
UserStatus::Active => println!("Пользователь активен"),
_ => (),
}
Способ 2 - через if let (не всегда очевидно):
if let UserStatus::Active = status {
println!("Пользователь активен");
}
Решение - макрос matches! для лаконичных проверок:
let status = UserStatus::Active;
if matches!(status, UserStatus::Active) {
println!("Пользователь активен");
}
Почему matches! лучше для простых проверок:
- Код становится короче и понятнее.
- Четко выражает намерение - проверить соответствие шаблону.
- Можно использовать прямо в условиях без дополнительного блока.
Расширенные возможности matches!
Проверка нескольких вариантов сразу:
let status = UserStatus::Active;
if matches!(status, UserStatus::Active | UserStatus::Pending) {
println!("Пользователь может совершать действия");
}
Связывание значений с паттернами:
enum Payment {
Cash(f64),
Card { number: String, amount: f64 },
}
let payment = Payment::Cash(100.0);
if matches!(payment, Payment::Cash(amount) if amount > 50.0) {
println!("Наличный платеж на большую сумму");
}
Использование в выражениях возврата:
fn can_edit(status: UserStatus) -> bool {
matches!(status, UserStatus::Active | UserStatus::Moderator)
}
Комбинация с другими проверками:
let status = UserStatus::Active;
let has_permissions = true;
if matches!(status, UserStatus::Active) && has_permissions {
println!("Доступ разрешён");
}
Когда использовать matches! идеально:
- Проверка одного или нескольких вариантов enum.
- Простые булевы проверки соответствия паттерну.
- Условия фильтрации в итераторах.
- Валидация состояний в guard-условиях.
Вывод:
Макрос
matches! - это специализированный инструмент в арсенале Rust-разработчика. Он не заменяет полноценный
match, но идеально подходит для ситуаций, когда нужно быстро и ясно проверить соответствие шаблону. Используя его там, где он уместен, вы делаете код не только короче, но и более точным.