Сопоставление с образцом - это языковая функция, из которой оператор match
является лишь наиболее ярким примером.Вот два других часто используемых примера:
val List(x,y,(z: Int,w: Int)) = List("one","two",(3,4))
for ((text,i) <- List(("one",1),("two",2))) println(text + " = " + i)
Итак, нет, вы не можете сделать это самостоятельно.Язык не позволяет вам определять новые способы создания переменных, поэтому такие вещи могут происходить только с поддержкой языка.
Сам оператор match
использует поддержку создания переменных сопоставления с образцом внутри языка, нов противном случае в принципе может быть реализовано как функция библиотеки.Однако в некоторых случаях это было бы неэффективно:
// This is implemented with fast jumps, not slow if-then-else!
n match {
case 0 => // Do action 0
case 1 => // Do action 1
case 2 => // Do action 2
case _ => // Do default action
}
// This is tail recursive, so you won't overflow the stack!
def recursiveMatch(xs: List[Any]): List[Any] = xs match {
case (x @ Int) :: rest => recursiveMatch(rest)
case _ => xs
}
В общем, нет, вы не можете написать сопоставление с шаблоном самостоятельно, и хотя вы можете написать оператор сопоставления, есть преимущества в использованиисуществующий.