5 分钟速读之 Rust 权威指南(三十八)模板语法
模式语法
模式匹配在很多地方都有用到,比如let
声明变量,函数参数,match
语句,if let
等等,前面章节只是简单讲了一些基本使用方法,这一节我们来看一下所有的模式匹配方式和模式匹配的强大能力
匹配字面量
最简单的匹配能力,匹配字面量类型,例如下面i32
类型:
匹配命名变量
这种匹配方式一般用于解构,另外match
会为匹配的结果创建独立的作用域:
多个模式
还支持使用|
符号,表示或者的关系:
匹配范围
类似区间,还可以使用..=
来表示匹配一个区间:
不仅是数字,可以用char
类型来表示一个字符的区间:
解构结构体
结构体也可以在match
的匹配模式中,前面我们可能没讲到解构结构体,这里先看一下正常情况下解构结构体的方法:
解构的时候可以重命名结构体中字段:
最后我们在match
条件中解构,模式与上面一样:
解构枚举
结构体可以解构,当然枚举也不例外了:
在match
语句中匹配枚举值的多种变体:
解构嵌套的结构体和枚举
解构还支持多层嵌套的解构,下面在Message
枚举中嵌套Color
枚举,然后在match
语句中解构:
解构嵌套的结构体和元组
下面使用一个元组将Point
结构体嵌套,然后使用let
将其解构:
使用 _ 忽略整个值
有时候有些参数或者变量我们并不关心,这时可以使用_
来进行忽略,防止编译器报提醒,其实前面在match
语句中已经使用过了:
_
是不能直接使用的:
使用嵌套的_
忽略部分值:
一个模式中的多处使用_
来忽略特定值:
变量名称使用_
开头来忽略未使用的警告:
_
和_
开头变量的区别,_
变量会绑定变量:
_
并不会绑定变量的值:
使用 .. 忽略剩余的值
_
可以忽略单个值,但是如果在结构体时,我们如果只关心其中某一个属性,此时其他的属性不可能都用_
来忽略,因为太多了,此时我们可以使用..
来忽略结构体中的多个值:
忽略元组中的值:
..
不能有歧义:
匹配守卫提供的额外条件
匹配守卫(match guard)是一个指定于match
分支模式之后的额外if
条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况:
允许获取外部变量:
与多个模式结合使用:
@绑定
at 运算符@
允许我们在结构体、枚举中使用有条件的匹配,下面在枚举中使用@
:
在结构体中使用@
:
看了这么多例子是不是体会到了 rust 的模式匹配的强大,尤其是在match
语句中,可以帮我们少写很多条件判断,建议大家把上面的例子都试着写一下,加深一下印象,才能运用的熟练。
封面图:跟着Tina画美国
关注「码生笔谈」公众号,阅读更多最新章节
版权声明: 本文为 InfoQ 作者【码生笔谈】的原创文章。
原文链接:【http://xie.infoq.cn/article/2c08af4c6f8c31efbd15fd200】。文章转载请联系作者。
评论