1、Switch例子:
val v1=1 v1 match { case 1=> "1" case 2=> "2" case _=> "123" }
case_与default等效,如果没有模式匹配,抛出MatchError,case中不用break。match可以使用任何类型,不仅仅是数字。
2、守卫:像if表达式一样,match也提供守卫功能,守卫可以是任何Boolean条件。
3、模式中的变量:如果case关键字后面跟着一个变量名,那么匹配的表达式会被赋值给那个变量。scala中变量必须以小写字母开头,常量用大写字母,如果常量用小写字母开头需要加反引号。
4、类型模式:类型匹配时,必须设置一个变量名,匹配操作发生在运行期,不能比对一个泛型类型,但可以使用通配符。对数组来说,类型信息保存完好,可以匹配Array[Int].
5、匹配数组、列表和元组
1)匹配数组、列表:
Array(0)匹配只有一个元素且为0的数组。
Array(x,y)匹配数组有两个元素,并将两个元素赋值为x和y。
Array(0, _*)匹配数组以0开始。
2)匹配元组:集合元素通过匹配绑定到变量,这样的操作较"析构"。
6、提取器:模式如何匹配数组、列表和元组,这个背后的机制叫做提取器,一个对象如果带有从对象中提取的unapply和unapplySeq方法,apply方法接受构造参数,生成对象;而unapply方法接受对象,提取值,是一个反向操作。
注意:如果要提取单个值,则应该返回一个目标类型Option,例如:
Option[Int]
,而不是
Option[(Int)]
;无参数的提取器可以用Boolean检查。
7、变量声明中的模式:在变量声明中使用模式,例如:
val (x,y) = (1,2)
8、for表达式中的模式:for表达式可以使用提取器。
注意:for会忽略失败的匹配。
9、样例类:是类,除此之外它是为模式匹配而优化的类,样例类用case关键字进行声明,当声明样例类时,几件事自动发生:
1)构造器中的每一个参数都成为val--除非它被显式地声明为var(不建议这样做)
2)在半生对象中提供apply方法让你不用new关键字就能够造出相应的对象,比如:Dollar(29.95)或Currency(29.95,"EUR")
3)提供unapply方法让模式匹配可以工作。
4)将生成toString、equals、hashCode和copy方法--除非显式地给出这些方法的定义。
除上述外,样例类和其它类完全一样,可以添加方法和字段扩展等等。
10、copy方法和带名参数:copy创建一个与现有对象值相同的新对象,并可以通过带名参数来修改某些属性。
11、case语句的中置表达式:如果unapply方法产出一个元组,你可以在case语句中使用中置表达法。
12、匹配嵌套结构:样例类经常被用于嵌套结构。
13、密封类:如果想让case类的所有子类都必须在申明该类的相同的文件中定义,可以将样例类的通用超类声明为sealed,叫做密封类,密封就是外部用户不能在其他文件中定义子类。
14、模拟枚举:样例类可以模拟出枚举类型。
15、偏函数:不处理所有可能的输入,之处理那些能与至少一个case语句匹配的输入。在偏函数中只能使用case语句,整个函数必须用{}包围。普通的函数可以用{}和()包围;如果偏函数被调用,而函数的输入却与所有语句都不匹配,
系统会抛出一个MatchError运行时错误。可以用isDefineAt方法测试特定输入是否与偏函数匹配,避免错误。