scala - 使用提取器匹配订单

标签 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"
}

这种行为的原因是什么?

最佳答案

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

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

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

关于scala - 使用提取器匹配订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8469139/

相关文章:

javascript - 匹配以特定单词开头和结尾的所有摘录

java - 将数组与java中的字符串匹配

scala - 针对 Scala Map 条目的模式匹配

sql - ScalikeJDBC: 连接池尚未初始化。(name:'default)

scala - Scala 中的超时 future

scala - UDAF Spark 中的多列输出

excel - 使用 Excel VBA 从不同工作簿引用索引/匹配公式中的文件路径变量

scala - 为什么与 tuple 类型的提取器一起使用的 for-comprehension 会导致 `filter` 上的编译警告?

java - 电子邮件提取器 Java 模式排除点之前的字符

scala - 在 pureconfig 中表示 Either