查看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?
答案 0 :(得分:5)
只要您的对象具有unapply
或unapplySeq
(在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
方法只是免费提供的方法之一,还有toString
,equals
等。
请注意,提取器不必与相关类具有相同的名称,并且不必在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