Scala - Vals 和 Defs - 反编译

Scala - Vals and Defs - Decompiled

如果在 Scala 中,val foo: Int = 0 被反编译为:

private[this] val foo_: Int = 0
def foo: Int = foo_

那么 def 每次被调用时如何求值,而 val 只求值一次呢?由于 val 无论如何都被反编译为 def

对于val,有一个私有变量("val")和一个getter方法("def")。该变量使用计算一次的值进行初始化。

对于def,"cache"值没有变量,所以每次都会计算它。

 class Foo {
    val bar = { println("BAR"); "bar" }
 }

大致相当于

 class Foo {
     private var bar_ = { println("BAR"); "bar" }
     def bar = bar_
 }

初始化bar_的块只在创建class的实例时执行一次。所以,像

 val f = new Foo
 println("Created")
 f.bar
 f.bar
 f.bar

将打印出 "BAR",然后是 "Created",仅此而已。

但是如果你定义 Foo

 class Foo {
    def bar = { println("BAR"); "bar" }
 }

然后每次访问 bar 时都会评估该块,上面的代码将 首先 打印 "Created",然后 "BAR" 三次.