天天看點

話說模式比對(8) 一個抽取器的例子

一個抽取器的例子

目前list的序列模式(sequence pattern)可以支援對前邊若幹元素的比對,比如:<code>list(1,2,3,_*)</code>,如果想要實作 <code>list(_*, lastele)</code> 這樣的形式,就需要通過自定義一個抽取器來實作了

抽取器裡的<code>unapply</code>方法,入參對應你想要進行比對的對象,出參則是解構後的元素。

比如 <code>list match { case append(x,y) =&gt; }</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單例名稱也可以用符号表達,比如用”:&gt;“來表示

這樣對比對時的表達顯得更簡短一些

另外,以”:“結尾的符号支援從右到左的操作方式,list的子類就采用了“::”這樣的名稱,以友善模式比對(當然也是因為早期的一些函數式語言裡,如ml裡已經定義了::的形式,scala隻是延續而已)。