Как и другие плакаты уже указывали, List(x)
соответствует только список 1 элемента.
Существует, однако синтаксис для сопоставления нескольких элементов:
def example(list: List[Int]) = list match {
case Nil => println("Nil")
case List(x @ _*) => println(x)
}
example(List(11, 3, -5, 5, 889, 955, 1024)) // Prints List(11, 3, -5, 5, 889, 955, 1024)
Это смешно @ _*
, что делает разницу. _*
соответствует повторному параметру, а x @
говорит: «Свяжите это с x
».
То же самое работает с любым совпадением шаблонов, которое может соответствовать повторяющимся элементам (например, Array(x @ _*)
или Seq(x @ _*)
). List(x @ _*)
также может соответствовать пустым спискам, хотя в этом случае мы уже сопоставили Nil.
Вы также можете использовать _*
, чтобы соответствовать «остальные», как в:
def example(list: List[Int]) = list match {
case Nil => println("Nil")
case List(x) => println(x)
case List(x, xs @ _*) => println(x + " and then " + xs)
}
хз может быть любого типа. как я могу уловить xs типа List [Int] точно? –
Это обычная проблема в scala, полезная ссылка: http://stackoverflow.com/questions/12218641/scala-2-10-what-is-a-typetag-and-how-do-i-use-it – Infinity