Scala中的提取器是一個擁有稱為unapply方法,并使用unapply方法作為其成員之一的對象。 該unapply方法的目的是匹配一個值并將其分開。 通常,提取器對象還定義了一種用于構(gòu)建值的雙重方法,但這不是必需的。
示例
下面舉個例子來定義apply和unapply方法。apply方法與Test轉(zhuǎn)換為可應(yīng)用于括號中的參數(shù)的對象,與apply方法相同。所以可以寫Test(“Maxsu”,“gmail.com”)來構(gòu)造字符串“Maxsu@gmail.com”。
unapply方法是將Test類轉(zhuǎn)換為提取器,并反轉(zhuǎn)了應(yīng)用的構(gòu)建過程。在應(yīng)用兩個字符串,并形成一個電子郵件地址字符串,取消應(yīng)用接收電子郵件地址并返回潛在的兩個字符串:地址的用戶和域。
語法
unapply("Maxsu@gmail.com") equals Some("Maxsu", "gmail.com")
unapply("Maxsu Ali") equals None
以下示例程序顯示電子郵件地址的提取對象。
object Demo {
def main(args: Array[String]) {
println ("Apply method : " + apply("Maxsu", "gmail.com"));
println ("Unapply method : " + unapply("Maxsu@gmail.com"));
println ("Unapply method : " + unapply("Maxsu Ali"));
}
// The injection method (optional)
def apply(user: String, domain: String) = {
user +"@"+ domain
}
// The extraction method (mandatory)
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2){
Some(parts(0), parts(1))
} else {
None
}
}
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
Apply method : Maxsu@gmail.com
Unapply method : Some((Maxsu,gmail.com))
Unapply method : None
當(dāng)一個類的實例后跟括號為零個或多個參數(shù)的列表時,編譯器會調(diào)用該實例上的apply方法。 可以在對象和類中定義apply方法。
如上所述,unapply方法的目的是提取正在尋找的特定值。當(dāng)使用match語句比較提取器對象時,將自動執(zhí)行unapply方法。
嘗試以下示例程序 -
object Demo {
def main(args: Array[String]) {
val x = Demo(5)
println(x)
x match {
case Demo(num) => println(x+" is bigger two times than "+num)
//unapply is invoked
case _ => println("i cannot calculate")
}
}
def apply(x: Int) = x*2
def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
10
10 is bigger two times than 5