模式匹配

The match keyword lets you match a value against one or more patterns. The comparisons are done from top to bottom and the first match wins.

模式(pattern)可以是简单的值,其用法类似于 C 与 C++ 中的 switch

#[rustfmt::skip]
fn main() {
    let input = 'x';
    match input {
        'q'                       => println!("Quitting"),
        'a' | 's' | 'w' | 'd'     => println!("Moving around"),
        '0'..='9'                 => println!("Number input"),
        key if key.is_lowercase() => println!("Lowercase: {key}"),
        _                         => println!("Something else"),
    }
}

_ 模式是与任何值匹配的通配符模式。表达式 必须 不可反驳,即其涵盖了所有可能性,因此通常将 _ 用作最终的万能符。

Match can be used as an expression. Just like if, each match arm must have the same type. The type is the last expression of the block, if any. In the example above, the type is ().

模式中的变量(本例中为 key)将创建一个可在匹配分支内使用的绑定。

只有当条件为真时,保护语句才能使分支匹配成功。

This slide should take about 10 minutes.

关键点:

  • You might point out how some specific characters are being used when in a pattern

    • | as an or
    • .. can expand as much as it needs to be
    • 1..=5 represents an inclusive range
    • “_”是通配符
  • 有些想法比模式本身所允许的程度更加复杂,如果我们希望简要地表达这些想法,就必须把匹配守卫视为独立的语法功能。

  • 它们与匹配分支中的单独“if”表达式不同。选择匹配分支后,分支块内(在“=>”之后)会出现“if”表达式。如果该分支块内的“if”条件失败,系统不会考虑原始“match”表达式的其他分支。

  • 只要表达式在包含“|”的模式中,就会适用守卫定义的条件。