模式匹配
要理解模式匹配(pattern-matching),先把这两个单词拆开,先理解什么是模式(pattern),这里所的模式并不是设计模式里的模式,而是数据结构上的,这个模式用于描述一个结构的组成,类似正则
- 常量模式(包括常量变量和常量字面量)
- 变量模式
- 通配符模式
- 构造器模式(用构造器匹配一个对象,怎么实现??)
- 类型模式
- 变量绑定模式
2、怎么实现模式匹配的?
在面向对象的程序中数据被组织为一级一级的类(class),面向对象语言在模式匹配方面的问题在于如何从外部探测这个层级。
- 面向对象的分解 (decomposition)
- 访问器模式 (visitor)
- 类型测试/类型造型 (type-test/type-cast)
- typecase
- 样本类 (case class)
本质上case class是个语法糖,对你的类构造参数增加了getter访问,还有toString, hashCode, equals 等方法;
最重要的是帮你实现了一个伴生对象,这个伴生对象里定义了apply 方法和 unapply 方法。 apply方法是用于在构造对象时,减少new关键字;而unapply方法则是为模式匹配所服务。 - 抽取器 (extractor)
3、模式匹配的核心就是解构
4、模式匹配应用
赋值语句
List(1,List(2,3,4,5,6,7)) match { case List(_, x@List(2,_*)) => println(x.size) }//构造器+变量绑定匹配
val (a,b) = (100,200)//构造器+变量绑定
val 2=2//常量匹配
//是否所有的赋值语句都是模式匹配呢?
val a=123 //无模式匹配
for语句
for(i <- List(1,2,3) ) {println(i)}
for(i@2 <- List(1,2,3) ) {println(i)
5、自定义抽取器
//List的序列模式(sequence pattern)可以支持对前边若干元素的匹配,比如:List(1,2,3,_*),如果想要实现 List(_*, lastEle) 这样的形式,就需要通过自定义一个抽取器来实现了
// 自定义Extractor
object Append {
// 接受List结构
def unapply[A] (l: List[A]) = {
// 返回Tuple2:前边的若干元素和最后一个元素
Some( (l.init, l.last) )
}
}
(1 to 9).toList match{ case _ Append 9 => println("OK") }