【发布时间】:2011-12-12 13:22:08
【问题描述】:
我定义了一个自定义提取器来获取列表的最后一个元素,如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"
}
这种行为的原因是什么?
【问题讨论】:
-
它看起来像一个错误。我可以尝试在其中一个邮件列表上提问。
-
用
scalac -print编译,看来编译器正在对模式进行一些优化,并合并了List(7)和head :: tail的测试。它首先检查它是否是一个 Int 列表,然后检查第一个元素是否为 7,如果不是,它立即落入head::tail并匹配head::tail。这似乎确实是编译器中的一个错误。