鍍金池/ 教程/ Scala/ 定義 Extractor
定義 Extractor
正規(guī)表達(dá)式
Extractors 和 Seq 模式
可變參數(shù)的 Extractors
無(wú)參數(shù)和帶一個(gè)參數(shù)的模式定義
分解 Email 地址的例子

定義 Extractor

在 Scala 中 Extractor 為定義了 unapply 方法的對(duì)象。unapply 的作用是匹配一個(gè)值,然后從中提取所需的部分。通常 unapply 和 apply 一起定義,但這不是必須的。例如,前面定義上篇文章中所需的 Email 對(duì)象。

object EMail {
    def apply(user:String,domain:String) = user + "@" + domain
    def unapply(str:String) :Option[(String,String)] ={
        val parts = str split "@"
        if(parts.length==2) Some(parts(0),parts(1)) else None
    }
}

Email 對(duì)象定義了 apply 和 unapply 方法,apply 方法沒(méi)有什么特別之處,而 unapply 方法則把 EMail 對(duì)象變成了一個(gè) Extractor。在某種程度上來(lái)說(shuō),unapply 和 apply 的作用相反,apply 方法把兩個(gè)字符串參數(shù)變成一個(gè) Email 地址,而u napply 方法反向變換,把一個(gè)字符串分解成兩個(gè)部分:用戶名和域名。unapply 方法必須處理不能把一個(gè)字符串分解成兩部分的情況,這也是為什么這里 unapply 方法返回 Option 類型的原因。

簡(jiǎn)單的測(cè)試如下:

scala> EMail.unapply("james@guidebee.com")
res1: Option[(String, String)] = Some((james,guidebee.com))
scala> EMail.unapply("James Shen")
res2: Option[(String, String)] = None

現(xiàn)在,模式匹配碰到一個(gè)模式引用到一個(gè) Exactor 對(duì)象時(shí),會(huì)調(diào)用該對(duì)象的 unapply 方法,比如:

selectorString match { case EMail(user,domain) => ...

會(huì)調(diào)用

EMail.unapply(selectorString)

例如:

"james.shen@guidebee.com" match{
    case EMail(user,domain) => println (user +" AT " + domain)
    case _ =>
}
james.shen AT guidebee.com