scala如何在数组上匹配?

时间:2011-10-31 18:34:49

标签: scala

查看Scala代码,通过向apply添加object Array方法来实现方便的数组创建语法。起初,我认为这是通过案例类以某种方式实现的,因为您可以运行以下内容,但似乎并非如此:

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

我知道我还需要查看WrappedArray和所有超类,但我无法弄清楚scala如何在Arrays上实现这种匹配(我需要更熟悉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?

1 个答案:

答案 0 :(得分:5)

只要您的对象具有unapplyunapplySeq(在varargs的情况下)返回Option的对象,您就可以在任何类上使用此语法进行模式匹配或Boolean。这些被称为提取器。来自对象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

Scala中的编程chapter on extractors可能很有用。

对于案例类,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