作者:搖擺少年夢
apply與unapply方法
零變量或變量的模式比對
提取器與序列模式
scala中的占位符使用總結
apply方法我們已經非常熟悉了,它幫助我們無需new操作就可以建立對象,而unapply方法則用于析構出對象,在模式比對中特别提到,如果一個類要能夠應用于模式比對當中,必須将類聲明為case class,因為一旦被定義為case class,scala會自動幫我們生成相應的方法,這些方法中就包括apply方法及unapply方法。本節将從提取器(也稱析構器)的角度對unapply方法進行介紹。先看下面的這個例子(來源于programmin in scala)
在上述的代碼中,我們将unapply方法定義為:
<code>def unapply(str: string): option[(string, string)] = { val parts = str split "@" if (parts.length == 2) some(parts(0), parts(1)) else none }</code>
這是有道理的,原因在于可能會有不合法的email用于模式比對,例如:
從構造與析構的角度來看,apply方法也被稱為injection(注入),unapply方法也被稱為提取器,這兩個方法就像孿生兄弟一樣,經常在類或對象中被定義。以前我們在用類進行模式比對的時候都必須要将類聲明為case class,今天我們将不通過case class,而是定義一個普通的類實作自己的apply和unapply方法來實作模式比對,代碼如下:
上一節講的模式模式比對綁定的是兩個變量,它可以擴充到任意變量次元,這一節中我們對零變量和單個變量綁定的特殊情況進行介紹,我們來看下面的這個例子,該例子來源于 programmin in scala
代碼中的email(twice(x @ uppercase()),其執行順序是先調用email的unapply方法,然後再調用twice中的unapply方法,最後調用uppercase的unapply方法,如果傳回true,則将twice 中傳回的字元串指派給x。
list伴生對象具有下列定義形式:
從上面的代碼來看,與一般的提取器不同的是,序列模式采用unapplyseq代替unapply方法,并且傳回的類型是option[seq[t]] ,在講模式比對的時候我們提到過,序列模式中的比對經常會使用占位符_或_*的方式比對序列中的其它元素,這種方式為序列模式所獨有,例如:
添加公衆微信号,可以了解更多最新spark、scala相關技術資訊
