ВЯвляется ли Scala `match` конструктивным синтаксическим сахаром? Если да, то как это работает?
trait Expr
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr
object CaseExample {
def eval(e: Expr): Int = e match {
case Number(n) => n
case Sum(e1, e2) => eval(e1) + eval(e2)
}
def main(args: Array[String]) {
println(eval(Sum(Number(1), Number(2)))) //> 3
}
}
там совсем немного синтаксического сахара происходит. Я понимаю, что case
неявно создает два объекта
object Number extends Expr {
def apply(n: Int) = new Number(n)
}
object Sum extends Expr {
def apply(e1: Expr, e2: Expr) = new Sum(e1, e2)
}
, и именно поэтому мы можем написать, например, Sum(...)
и все еще создайте объект через класс, так как Sum(...)
также является синтаксическим сахаром для Sum.apply(...)
.
Я прав, что match
Конструкция также синтаксический сахар? Если да, то каким образом - например. case Number(n)
- переписан компилятором?
Я спрашиваю, потому что я не вижу, чтобы n
в case Number(n)
где-нибудь определен и/или привязан к значению. Как ни странно, в конструкции match
имеет место случай первой буквы (если она будет в верхнем регистре, она будет постоянной). Это странно, потому что, насколько я знаю, это только в конструкции релевантности match
, поэтому я понятия не имею, как это было бы de-sugared.
Я не знаю, является ли совпадение шаблонов _actually_ desugared, но в принципе оно может быть преобразовано в некоторые 'if's, используя [' unapply'] (http://stackoverflow.com/a/36860003/1346276). – phg