如何使用模式匹配捕获多个变量?

时间:2016-08-03 09:16:04

标签: scala scala-collections

例如:

List(1,2,3,4) match {
  case List(x: Int, y: Int, *rest) =>
    println(rest) // i want to get List(3,4)
}

_*可以匹配多个变量,但似乎能够捕获它们。

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以使用rest @ _*

List(1,2,3,4) match {
  case List(x: Int, y: Int, rest @ _*) =>
    println(rest) 
}

请注意,这是一般性的:您可以使用x @ pattern将名称x提供给pattern匹配的任何值(前提是此值具有合适的类型)。请参阅http://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html#pattern-binders

答案 1 :(得分:2)

List(1, 2, 3, 4) match {
  case _ :: _ :: tail => println(tail) // prints List(3, 4)
}

答案 2 :(得分:2)

您可以通过cons运算符简单匹配列表:

List(1, 2, 3, 4) match { 
    case x :: y :: rest => println(rest) 
} // gives you "List(3, 4)" to stdout

答案 3 :(得分:1)

在列表上调用模式匹配的另一种方法,

val List(x,y,rest @ _*) = List(1,2,3,4)

提取

x: Int = 1
y: Int = 2
rest: Seq[Int] = List(3, 4)