0Pricing
Learn Rust Coding · Урок

Подробно о match

Шаблоны и охранные условия

«Подробно о match» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Выражение match

match сравнивает значение с последовательностью образцов и выполняет ветвь первого совпадения. Это выражение, поэтому оно возвращает значение.

fn main() {
    let n = 3;
    let label = match n {
        1 => "one",
        2 => "two",
        3 => "three",
        _ => "many",
    };
    println!("{label}");
}

Полнота сопоставления

match должен охватывать каждое возможное значение. Шаблон _ перехватывает всё, что не совпало с предыдущими ветвями, обеспечивая полноту сопоставления.

fn main() {
    let x = 42;
    match x {
        0 => println!("zero"),
        _ => println!("nonzero"),
    }
}

Сопоставление нескольких значений

Используйте |, чтобы сопоставить несколько образцов в одной ветви.

fn main() {
    let c = 'e';
    match c {
        'a' | 'e' | 'i' | 'o' | 'u' => println!("vowel"),
        _ => println!("consonant"),
    }
}

Образцы-диапазоны

Сопоставляйте диапазон значений с помощью ..= (включительно). Это удобно для группировки чисел или символов.

fn main() {
    let score = 85;
    let grade = match score {
        90..=100 => 'A',
        80..=89 => 'B',
        70..=79 => 'C',
        _ => 'F',
    };
    println!("Grade: {grade}");
}

Условия-ограничители в match

Условие-ограничитель — это дополнительное условие if для ветви. Ветвь срабатывает, только если подходит образец и условие-ограничитель истинно.

fn main() {
    let pair = (2, -2);
    match pair {
        (x, y) if x + y == 0 => println!("sum is zero"),
        (x, _) if x % 2 == 0 => println!("first is even"),
        _ => println!("no rule"),
    }
}

Привязка в образцах

Образцы могут связывать сопоставленные части со переменными, чтобы использовать их в теле ветви.

fn main() {
    let msg = Some(7);
    match msg {
        Some(n) => println!("got {n}"),
        None => println!("nothing"),
    }
}

Сопоставление перечислений

match особенно хорошо подходит для перечислений, в частности когда варианты содержат данные.

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
}

fn area(s: Shape) -> f64 {
    match s {
        Shape::Circle(r) => 3.14159 * r * r,
        Shape::Rectangle(w, h) => w * h,
    }
}

fn main() {
    println!("{}", area(Shape::Rectangle(3.0, 4.0)));
}

Игнорирование с помощью _ и ..

Используйте _, чтобы проигнорировать одно значение, а .. — чтобы проигнорировать остальные элементы кортежа или структуры.

fn main() {
    let triple = (1, 2, 3);
    match triple {
        (first, ..) => println!("first is {first}"),
    }
}

Возврат из match

Поскольку match является выражением, его результат можно присвоить переменной или сразу вернуть. Каждая ветвь должна выдавать один и тот же тип.

fn describe(n: i32) -> &'static str {
    match n.cmp(&0) {
        std::cmp::Ordering::Less => "negative",
        std::cmp::Ordering::Equal => "zero",
        std::cmp::Ordering::Greater => "positive",
    }
}

fn main() {
    println!("{}", describe(-5));
}

Порядок ветвей имеет значение

Ветви проверяются сверху вниз; срабатывает первая подходящая. Размещайте конкретные образцы перед общими, а шаблон-заменитель — последним.

Привязка диапазонов с помощью @

Объедините диапазон с оператором @, чтобы проверить значение и сохранить его точное содержимое в той же ветви.

fn main() {
    let n = 42;
    match n {
        small @ 0..=9 => println!("single digit: {small}"),
        big @ 10..=99 => println!("two digits: {big}"),
        _ => println!("large"),
    }
}

Быстрая проверка

Для чего нужно условие-ограничитель в (x, y) if x > y?

Повторение

Вы подробно изучили match:

  • Это полное выражение, возвращающее значение
  • | сопоставляет несколько образцов, а ..= — диапазоны
  • Условия-ограничители добавляют дополнительные условия if
  • Образцы связывают данные, а _ и .. игнорируют части значения
  • Порядок ветвей имеет значение — побеждает первое совпадение

Часто задаваемые вопросы

Урок «Подробно о match» бесплатный?

Да — полный текст урока «Подробно о match» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Подробно о match»?

Шаблоны и охранные условия Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Подробно о match»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Подробно о match
  2. if let и while let
  3. Связывание с помощью @
  4. Деструктуризация
← Назад к Learn Rust Coding