ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
一个简单的`if`/`else`往往是不够的,因为你可能有两个或更多个选项。这样`else`也会变得异常复杂,所以我们该如何解决? Rust有一个`match`关键字,它可以让你有效的取代复杂的`if`/`else`组。看看下面的代码: ~~~ let x = 5; match x { 1 => println!("one"), 2 => println!("two"), 3 => println!("three"), 4 => println!("four"), 5 => println!("five"), _ => println!("something else"), } ~~~ `match`使用一个表达式然后基于它的值分支。每个分支都是`val => expression`这种形式。当匹配到一个分支,它的表达式将被执行。`match`属于“模式匹配”的范畴,`match`是它的一个实现。 那么这有什么巨大的优势呢?这确实有优势。第一,`match`强制_穷尽性检查_(_exhaustiveness checking_)。你看到了最后那个下划线开头的分支了吗?如果去掉它,Rust将会给我们一个错误: ~~~ error: non-exhaustive patterns: `_` not covered ~~~ 换句话说,Rust试图告诉我们,我们忘记了一个值。因为`x`是一个整形,Rsut知道它有很多不同的值,比如,`6`。如果没有`_`分支,那么这就没有分支可以匹配了,Rust就会拒绝编译。`_`就像一个_匹配所有_的分支。如果其它的分支都没有匹配上,就会选择`_`分支,并且因为我们匹配所有的分支,我们现在就有了一个可以表示`x`所有可能的值的分支了,这样我们的程序就能顺利编译了。 `match`也是一个表达式,也就是说它可以用在`let`绑定的右侧或者其它直接用到表达式的地方: ~~~ let x = 5; let numer = match x { 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five", _ => "something else", }; ~~~ 有时,这是一个把一个类型的数据转换为另一个类型的好方法。