SerJ de SuDDeN ответ абсолютно верен, но некоторые подробности, почему код, который вы упомянули, работают так, как он работает.
val (a, b) = (1, 2)
называется экстрактором выражения соответствия шаблона. Значение с правой стороны соответствует экстрактору с левой стороны. Это может быть сделано везде в Scala и может иметь разные лица. Например, сопоставление с образцом в списке может выглядеть примерно так:
scala> val head :: tail = 1 :: 2 :: 3 :: Nil
head: Int = 1
tail: List[Int] = List(2, 3)
Справа * -символ * 1007 - это метод класса List, который добавляет к нему элементы. С левой стороны ::
-символ - это экстрактор класса ::
, подкласс List.
Некоторые другие места могут быть для понимания
scala> for ((a, b) <- (1 to 3) zip (4 to 6)) println(a+b)
5
7
9
или эквивалентные обозначения с методами более высокого порядка
scala> (1 to 3) zip (4 to 6) foreach { case (a, b) => println(a+b) }
5
7
9