Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Выражения match

match можно использовать, чтобы проверить значение на соответствие одному или нескольким вариантам:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let val = 1;
    match val {
        1 => println!("one"),
        10 => println!("ten"),
        100 => println!("one hundred"),
        _ => {
            println!("something else");
        }
    }
}

Как и выражения if, match тоже может возвращать значение;

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let flag = true;
    let val = match flag {
        true => 1,
        false => 0,
    };
    println!("The value of {flag} is {val}");
}
This slide should take about 5 minutes.
  • Ветви match проверяются сверху вниз, и выполняется тело первой подходящей ветви.

  • В отличие от switch в других языках, здесь нет «проваливания» (fall-through) между ветвями.

  • Телом ветки match может быть одно выражение или блок. Технически это одно и то же, ведь блоки тоже являются выражениями, но на этом этапе студенты могут не до конца понять такую симметрию.

  • Выражения match должны быть исчерпывающими: они должны покрывать все возможные значения или иметь ветку по умолчанию, например _. Исчерпывающность проще всего показать на перечислениях, но перечисления ещё не введены. Поэтому мы демонстрируем сопоставление с bool, как с самым простым примитивным типом.

  • На этом слайде match вводится без разговора о сопоставлении с образцом, чтобы студенты успели освоиться с синтаксисом и не получили слишком много информации сразу. О сопоставлении с образцом подробнее поговорим завтра, поэтому здесь старайтесь не углубляться.

Для дальнейшего изучения

  • Чтобы лучше объяснить пользу match, можно сравнить примеры с эквивалентами на if. Во втором случае, при сопоставлении с bool, блок if {} else {} очень похож. Но в первом примере, где проверяется несколько вариантов, выражение match может быть короче, чем if {} else if {} else if {} else.

  • match также поддерживает охранники (match guards), которые позволяют добавить произвольное логическое условие, определяющее, выполнять ли ветку. Однако разговор об охранниках требует объяснения сопоставления с образцом, а на этом слайде мы стараемся этого избежать.