为什么带有未知标识符的匹配表达式会编译并运行?

时间:2018-11-23 21:29:23

标签: rust

我希望Rust编译器抱怨匹配中缺少的情况以及未知的标识符:

pub enum MyEnum {
    Case1,
    Case2,
}

impl MyEnum {
    fn my_func(&self) {
        match self {
            _whatever_string => println!("Why am I printed ?"),
        }
    }
}

fn main() {
    let x = MyEnum::Case1;
    x.my_func();
}

为什么要编译并调用println

1 个答案:

答案 0 :(得分:4)

您的示例是对here进行了解释的特例:

let x = 5;

let number = match x {
    1 => "one",
    2 => "two",
    3 => "three",
    4 => "four",
    5 => "five",
    _ => "something else",
};

考虑最后一种情况(_),该情况与之前未提及的任何情况都匹配。编译器不会抱怨丢失的情况(因为最后一个分支涵盖了“其他所有内容”)。

您的示例基本上是相同的:一个match,它的一条手臂覆盖了所有内容。您也可能写了_而不是_whatever_string或其他标识符-然后可以在相应的分支中使用它。

因此,此match仅匹配并执行单个语句中的语句。编译器看到单个分支涵盖了所有内容,并且无需抱怨。