一個抽取器的例子
目前list的序列模式(sequence pattern)可以支援對前邊若幹元素的比對,比如:<code>list(1,2,3,_*)</code>,如果想要實作 <code>list(_*, lastele)</code> 這樣的形式,就需要通過自定義一個抽取器來實作了
抽取器裡的<code>unapply</code>方法,入參對應你想要進行比對的對象,出參則是解構後的元素。
比如 <code>list match { case append(x,y) => }</code> 裡面的<code>list</code>對應unapply的入參,<code>x,y</code>對應<code>unapply</code>方法的出參。
傳回boolean,那麼比對時 case a() 裡面的true不用寫(也不能寫)
若原本想要傳回類型為t,則使用option[t],這樣是為了比對時能夠判斷是否成功,some[t] 成功,none不成功
若原本想要傳回一組t1,…tn,則使用option[(t1,…tn)]
現在看看上面自定義抽取器的使用例子:
上面使用了中綴寫法,也可以寫成普通的構造方式,隻是看起來沒有上面的舒服
另外,如果覺得append這個名字太啰嗦,抽取器object單例名稱也可以用符号表達,比如用”:>“來表示
這樣對比對時的表達顯得更簡短一些
另外,以”:“結尾的符号支援從右到左的操作方式,list的子類就采用了“::”這樣的名稱,以友善模式比對(當然也是因為早期的一些函數式語言裡,如ml裡已經定義了::的形式,scala隻是延續而已)。