Chi Zhang
Chi Zhang

Reputation: 851

How can I capture multiple variables using pattern matching?

For example:

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

_* can match multiple variables but do to seem to be able to capture them.

Thanks!

Upvotes: 0

Views: 181

Answers (4)

elm
elm

Reputation: 20415

Another way to invoke pattern matching on lists,

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

which extracts

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

Upvotes: 1

Alexey Romanov
Alexey Romanov

Reputation: 170849

You can use rest @ _* for this:

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

Note that this is general: you can use x @ pattern to give the name x to any value matched by pattern (provided this value has a suitable type). See http://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html#pattern-binders.

Upvotes: 4

Fellrond
Fellrond

Reputation: 231

You can simply match lists by cons operator:

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

Upvotes: 2

Paweł Jurczenko
Paweł Jurczenko

Reputation: 4471

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

Upvotes: 2

Related Questions