在
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
in 在case Number(n)
任何地方定义和/或绑定到一个值。奇怪的是,在match
构造中,第一个字母的大小写很重要(如果它是大写字母,它将是一个常数)。这很奇怪,因为据我所知,这只是一个match
相关的结构,所以我不知道如何去糖。