3.6 KiB
match 控制流
match,它允许你将值与一系列模式进行比较,然后根据匹配的模式执行代码。模式可以由文字值、变量名、通配符和许多其他内容组成。
对于 if,表达式需要返回一个布尔值,但是在这里,它可以返回任何类型。
一个臂有两部分:一个模式和一些代码。这里的第一个臂有一个模式,即值 Coin::Penny,然后是 => 运算符,它将模式和要运行的代码分隔开来。在这种情况下,代码只是值 1。每个臂与下一个臂用逗号隔开。
如果匹配臂的代码很短,我们通常不使用花括号。如果要在匹配臂中运行多行代码,则必须使用花括号,并且臂之后的逗号就可选了
绑定到值的模式
匹配臂的另一个有用特性是它们可以绑定到与模式匹配的值的部分。
Matching with Option
对枚举进行匹配,将变量绑定到内部数据,然后根据它执行代码。
Matches Are Exhaustive
使用 match 语句时,必须考虑到所有可能的情况(包括None),否则编译器会报错。这与其他语言中的 switch 语句不同,在其他语言中,switch 语句通常可以有一个 default 分支,如果没有匹配到任何一个条件,则执行 default 分支。
错误写法如下:
Catch-all Patterns and the _ Placeholder
在前两个臂中,模式是 3 和 7 的字面值。对于覆盖所有其他可能值的最后一个臂,模式是我们选择的命名为 other 的变量。其他臂运行的代码使用该变量,通过将其传递给 move_player 函数。
即使我们没有列出 u8 可以具有的所有可能值,该代码也可以编译,因为最后一个模式将匹配未列出的所有值。这个通用模式满足 match 必须是完全的要求。请注意,我们必须将通用臂放在最后,因为模式按顺序计算。如果我们将通用臂放在前面,其他臂将永远不会运行,所以如果在通用臂之后添加臂,Rust 会给出警告!
Rust 还有一个模式,我们可以在想要通用臂但不想在通用臂模式中使用值时使用:_ 是一个特殊模式,它匹配任何值,并不绑定到该值。这告诉 Rust 我们不会使用该值,因此 Rust 不会给出未使用变量的警告。
通用臂之后添加臂:
可以在想要通用臂但不想在通用臂模式中使用值时使用_: _是一个特殊模式,它匹配任何值,并不绑定到该值。这告诉 Rust 我们不会使用该值,因此 Rust 不会给出未使用变量的警告。
除了3或7以外的任何东西,不会发生任何其他事情