7.5 match表达式
Scala的match表达式允许你从若干可选值(alternative)中选择,就像其他语言中的switch语句那样。一般而言,match表达式允许你用任意的模式(pattern)来选择(参见第13章)。抛开一般的形式不谈,目前我们只需要知道使用match可以从多个可选值中进行选择即可。
我们来看一个例子,示例7.14中的脚本从参数列表中读取食物名称并打印这个食物的搭配食材。这个match表达式首先检查firstArg,这个变量对应的是参数列表中的首个参数。如果是字符串"salt",则打印"pepper";如果是字符串"chips",则打印"salsa";则此类推。默认的样例以下画线(_)表示,这个通配符在Scala中经常被用来表示某个完全不知道的值。
示例7.14 带有副作用的match表达式
Scala的match表达式与Java的switch相比,有一些重要的区别。其中一个区别是任何常量、字符串等都可以被用作样例,而不仅限于Java的case语句支持的整型、枚举和字符串常量。在示例7.14中,可选值是字符串。另一个区别是在每个可选值的最后并没有break。在Scala中,break是隐含的,并不会出现某个可选值执行完成后继续执行下一个可选值的情况。这通常是我们预期的(不直通到下一个可选值),代码因此变得更短,也避免了一类代码错误,使得程序员不会再不小心直通到下一个可选值了。
不过Scala的match表达式与Java的switch语句相比最显著的不同在于,match表达式会返回值。在示例7.14中,match表达式的每个可选值都打印出一个值。如果我们将打印语句换成交出某个值,则相应的代码依然能工作,如示例7.15所示。从这个match表达式得到的结果被保存在friend变量中。这样的代码不仅更短(至少字数更少了),它还将两件不同的事情解耦了:首先选择食物,然后将食物打印出来。
示例7.15 交出值的match表达式