話說模式匹配(7) 一個構造器模式的例子(by case class)
阿新 • • 發佈:2018-12-23
在第一篇講述構造器模式匹配的時候給出過tree的例子,因為tree的資料結構很適合用構造器模式來解構。這次再看另一個例子。
scala裡的List是個典型的很適用模式匹配的結構,它的介面和資料定義非常凝練。現在我們假設需要一個與List結構正好相反的結構MyList。
List由2部分組成,[head, tail],其中的head是元素本身,而tail則是List型別,也就是一種遞迴結構。
MyList也由2部分組成 [init, last],其中last是元素本身,而init則是MyList型別。(與List正好顛倒)
// 定義抽象類 abstract class MyList[+A] // 具體子類,資料由兩部分組成:init,last case class Cons[B] (init:MyList[B], last:B) extends MyList[B] // 元素為空的MyList單例物件,類似 Nil case object Empty extends MyList[Nothing]
構造一下看看:
scala> val a = Cons(Empty,1)
a: Cons[Int] = Cons(Empty,1)
scala> a.last
res0: Int = 1
// 巢狀
scala> val b = Cons(Cons(Empty,1),2)
b: Cons[Int] = Cons(Cons(Empty,1),2)
// 模式匹配(Cons可以用中綴表達)
scala> b match{ case x Cons 1 Cons 2 => print(x) }
Empty
為了方便構造,還可以給MyList新增一個工廠方法:
object MyList {
def apply[A](xs:A*):MyList[A] = {
var r:MyList[A] = null
var t:MyList[A] = Empty
for(x<-xs) { r = Cons(t,x); t=r}
r
}
}
eg:
scala> MyList(1,2,3) match{ case x Cons 2 Cons 3 => print(x)} Cons(Empty,1) scala> MyList(1,2,3,4) match{ case x Cons 4 => print(x) } Cons(Cons(Cons(Empty,1),2),3)