匹配订单与提取器

时间:2011-12-12 01:56:42

标签: scala match extractor

我定义了一个自定义提取器来获取列表的最后一个元素,如https://stackoverflow.com/a/6697749/1092910中所示:

object :+ {
  def unapply[A](l: List[A]): Option[(List[A], A)] = {
    if (l.isEmpty)
      None
    else 
      Some(l.init, l.last)
  }
}

现在这匹配“好”:

List(1, 2, 3) match {
  case init :+ last => "good"
  case head :: tail => "bad"
}

但如果我添加另一个条款,它现在突然匹配“坏”:

List(1, 2, 3) match {
  case List(7) => "never"
  case init :+ last => "good"
  case head :: tail => "bad"
}

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:6)

这是#1697/2337和十几个副本。

https://issues.scala-lang.org/browse/SI-1697

可以肯定地说,它不会以直接方式修复,而是删除virtpatmat实现的模式匹配器。尝试最近的构建并使用-Yvirtpatmat进行编译,您将得到正确的答案。