scala如何在数组上匹配?

sch*_*mmd 1 scala

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

Array(1,2,3) match { case Array(a, b, c) => a + b + c }
Run Code Online (Sandbox Code Playgroud)

我知道我还需要查看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 }
Run Code Online (Sandbox Code Playgroud)

他们如何使用Array工作?

Lui*_*hys 5

您可以在任何类上使用此语法进行模式匹配,只要您有一个带有unapply或者unapplySeq(在varargs的情况下)返回一个Option或的方法的对象Boolean.这些被称为提取器.来自对象的问题Array是

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

在您的示例中,您可以使用它来匹配它

class A(val x: Int)

object A {
  def unapply(a: A) = Some(a.x)
}
Run Code Online (Sandbox Code Playgroud)

所以现在

scala> new A(4) match { case A(x) => x }
res1: Int = 4
Run Code Online (Sandbox Code Playgroud)

关于提取器的 Scala编程章节可能很有用.

对于情况类,一个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
Run Code Online (Sandbox Code Playgroud)