You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.6 KiB

match 控制流

match,它允许你将值与一系列模式进行比较,然后根据匹配的模式执行代码。模式可以由文字值变量名通配符和许多其他内容组成。

image-20230109092754370

对于 if,表达式需要返回一个布尔值,但是在这里,它可以返回任何类型。

一个臂有两部分:一个模式和一些代码。这里的第一个臂有一个模式,即值 Coin::Penny,然后是 => 运算符,它将模式和要运行的代码分隔开来。在这种情况下,代码只是值 1。每个臂与下一个臂用逗号隔开

如果匹配臂的代码很短,我们通常不使用花括号。如果要在匹配臂中运行多行代码,则必须使用花括号,并且臂之后的逗号就可选了

image-20230109095933017

绑定到值的模式

匹配臂的另一个有用特性是它们可以绑定到与模式匹配的值的部分。

image-20230109104321768

Matching with Option

对枚举进行匹配,将变量绑定到内部数据,然后根据它执行代码。

image-20230109110432810

Matches Are Exhaustive

使用 match 语句时,必须考虑到所有可能的情况(包括None),否则编译器会报错。这与其他语言中的 switch 语句不同,在其他语言中,switch 语句通常可以有一个 default 分支,如果没有匹配到任何一个条件,则执行 default 分支。

错误写法如下:

image-20230109112300779

Catch-all Patterns and the _ Placeholder

在前两个臂中,模式是 3 和 7 的字面值。对于覆盖所有其他可能值的最后一个臂,模式是我们选择的命名为 other 的变量。其他臂运行的代码使用该变量,通过将其传递给 move_player 函数。

即使我们没有列出 u8 可以具有的所有可能值,该代码也可以编译,因为最后一个模式将匹配未列出的所有值。这个通用模式满足 match 必须是完全的要求。请注意,我们必须将通用臂放在最后,因为模式按顺序计算。如果我们将通用臂放在前面,其他臂将永远不会运行,所以如果在通用臂之后添加臂,Rust 会给出警告!

Rust 还有一个模式,我们可以在想要通用臂但不想在通用臂模式中使用值时使用:_ 是一个特殊模式,它匹配任何值,并不绑定到该值。这告诉 Rust 我们不会使用该值,因此 Rust 不会给出未使用变量的警告

image-20230109140725594

通用臂之后添加臂:

image-20230109141155765

可以在想要通用臂但不想在通用臂模式中使用值时使用_: _是一个特殊模式,它匹配任何值,并不绑定到该值。这告诉 Rust 我们不会使用该值,因此 Rust 不会给出未使用变量的警告。

image-20230109142652724

除了3或7以外的任何东西,不会发生任何其他事情

image-20230109143000827