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" 三次.
如果在 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" 三次.