Добавить объявление

Макрос matches! для элегантной проверки enum в Rust

При работе с перечислениями в 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, но идеально подходит для ситуаций, когда нужно быстро и ясно проверить соответствие шаблону. Используя его там, где он уместен, вы делаете код не только короче, но и более точным.
06.12.2025 14 204