Scala提取器
提取器在Scala中是一個對象,有一個叫非應用作為其成員的一種方法。即不應用方法的目的是要匹配的值,並把它拆開。通常,提取對象還限定了雙方法申請構建值,但是這不是必需的。
下麵的例子顯示電子郵件地址的提取器對象:
object Test { def main(args: Array[String]) { println ("Apply method : " + apply("Zara", "gmail.com")); println ("Unapply method : " + unapply("Zara@gmail.com")); println ("Unapply method : " + unapply("Zara 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 } } }
這個對象定義了 apply 和unapply 方法。該apply 方法具有相同的含義:它原來的測試為可以被應用到的參數在括號中的方法所應用的相同的方式的對象。所以,可以寫為Test("Zara", "gmail.com") 來構造字符串“Zara@gmail.com”。
unapply方法使測試類成為一個提取器並反轉應用的構造過程。應用需要兩個字符串,並形成了一個電子郵件地址以找到它們,非應用unapply需要一個電子郵件地址,並可能返回兩個字符串:用戶和地址的域名。
unapply還必須處理中給定的字符串不是一個電子郵件地址的情況。這就是為什麼unapply返回一個選項型過對字符串。其結果要麼是一些(用戶域)如果字符串str使用給定電子郵件地址的用戶和域的部分,或None,如果str不是一個電子郵件地址。下麵是一些例子:
unapply("Zara@gmail.com") equals Some("Zara", "gmail.com") unapply("Zara Ali") equals None
讓我們編譯和運行上麵的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test Apply method : Zara@gmail.com Unapply method : Some((Zara,gmail.com)) Unapply method : None C:/>
模式匹配使用提取器:
當一個類的實例後跟括號使用零個或多個參數的列表,所述編譯器調用應用的方法在該實例上。我們可以定義同時適用對象和類。
如上述所提到的,unapply方法的目的是提取我們尋找一個特定的值。它相反的操作和apply一樣。當比較使用匹配語句中unapply方法的提取對象將被自動執行,如下所示:
object Test { def main(args: Array[String]) { val x = Test(5) println(x) x match { case Test(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 }
讓我們編譯和運行上麵的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test 10 10 is bigger two times than 5 C:/>