2011-10-31 63 views
1

通過查看Scala代碼,便捷陣列創建語法是通過在object Array中添加apply方法實現的。起初,我以爲這是通過case類莫名其妙地實現,因爲你可以運行下面的,但是這似乎並沒有這樣的情況:Scala如何與數組匹配?

Array(1,2,3) match { case Array(a, b, c) => a + b + c } 

我知道我還需要看看WrappedArray和所有的超,但我無法弄清楚scala如何在數組上實現這種匹配(並且我需要更熟悉scala集合類的層次結構)。這當然不適用於普通的課程。

scala> class A(val x: Int) 
scala> new A(4) match { case A(x) => x } 
<console>:9: error: not found: value A 
       new A(4) match { case A(x) => x } 
            ^
<console>:9: error: not found: value x 
       new A(4) match { case A(x) => x } 

他們如何得到這個與Array一起工作?

回答

5

您可以模式匹配與此語法上的任何類,只要你有一個對象與一個unapplyunapplySeq(在可變參數的情況下)方法返回一個OptionBoolean。這些被稱爲提取器。從對象Array有問題的線條

def unapplySeq[T](x: Array[T]): Option[IndexedSeq[T]] = 
    if (x == null) None else Some(x.toIndexedSeq) 

在您的例子,你可以得到它使用

class A(val x: Int) 

object A { 
    def unapply(a: A) = Some(a.x) 
} 

所以現在

scala> new A(4) match { case A(x) => x } 
res1: Int = 4 

的編程在斯卡拉chapter on extractors可能是有用的匹配。

對於case類,一個unapply方法只是包括它是爲了自由的方法之一,具有toStringequals沿等

注意,提取不必具有相同的名稱作爲有問題的類,並且它不必在object對象中定義。例如,你的情況,你可以寫同樣

val xyz = new { def unapply(a: A) = Some(a.x) } //extending java.lang.Object 

new A(4) match { case xyz(x) => x }    //Int = 4 
+0

只是爲了精度:這是不可能添加到JVM數組類,但不應用/ unapplySeq在對象,而不是類通常定義。 Scala可能會添加一個[Array](http://www.scala-lang.org/api/current/index.html#scala.Array$)對象。 –

+0

@didierd你當然是對的。我已經更新了我的答案。 –