1. 程式人生 > >話說模式匹配(7) 一個構造器模式的例子(by case class)

話說模式匹配(7) 一個構造器模式的例子(by case class)

第一篇講述構造器模式匹配的時候給出過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)