Совпадение порядка с экстрактором - PullRequest
6 голосов
/ 12 декабря 2011

Я определил пользовательский экстрактор, чтобы получить последний элемент списка, как в 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 Ответ

6 голосов
/ 12 декабря 2011

Это # 1697/2337 и дюжина дубликатов.

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

Можно с уверенностью сказать, чтоэто будет исправлено не напрямую, а путем удаления сопоставителя шаблонов для реализации virtpatmat.Попробуйте последнюю сборку и скомпилируйте с -Yvirtpatmat, вы получите правильный ответ.

...