In
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
, поэтому я понятия не имею, как это можно было бы обесценить.
if
с помощьюunapply
а>. - person phipsgabler   schedule 03.05.2016