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