Scala unapplySeq提取器语法

Bri*_*ent 9 scala pattern-matching scala-2.11

我(无意中)遇到了一些模式匹配语法,我没想到要编译,现在无法弄清楚.

它似乎与...有关unapplySeq.

请注意case x List(_,_)这个简单示例中的部分:

val xs = List(1, 2, 3)                          //> xs  : List[Int] = List(1, 2, 3)

xs match {
    case x List (_, _) => "yes"
    case _             => "no"
}                                               //> res0: String = yes
Run Code Online (Sandbox Code Playgroud)

我习惯于:@模式匹配语法,但我对此感到困惑.这种语法如何工作以及它与它的关系是什么(如果有的话)unapplySeq

在Scala 2.11.6中执行的示例代码

bjf*_*her 3

等效的非中缀版本是:

\n\n
xs match {\n  case List(x, _, _) => "yes"\n  case _             => "no"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Scala 规范说:

\n\n
\n

中缀操作模式 p;op;q 是构造函数\n 或提取器模式 op(p,q) 的简写。模式中运算符的优先级和结合性与表达式中的相同。

\n\n

中缀操作模式 p;op;(q1,\xe2\x80\xa6,qn) 是\n 构造函数或提取器模式 op(p,q1,\xe2\x80\xa6,qn) 的简写。

\n
\n

  • 例如,我无法编写“val xs = 1 List (2, 3)”来获取“List(1, 2, 3)” (2认同)
  • 哇,这太不直观了!看起来它与“unapplySeq”无关。给定定义 `case class Foo(a:Int, b:Int, c:Int)`,则实例 `Foo(1, 2, 3)` 将匹配模式 `case 1 Foo(2, 3)`。 (2认同)