Scala-VAL和Defs-反编译
如果在Scala中,此Scala-VAL和Defs-反编译,scala,decompiling,Scala,Decompiling,如果在Scala中,此val foo:Int=0被反编译为: private[this] val foo_: Int = 0 def foo: Int = foo_ 那么,defs如何在每次调用时进行求值,而vals仅进行一次求值?由于val被反编译为def,对于val,有一个私有变量(“val”)和一个getter方法(“def”)。变量初始化为一个值,该值计算一次 对于def,没有变量“缓存”该值,因此每次都会计算该值 class Foo { val bar = { printl
val foo:Int=0
被反编译为:
private[this] val foo_: Int = 0
def foo: Int = foo_
那么,
def
s如何在每次调用时进行求值,而val
s仅进行一次求值?由于val
被反编译为def
,对于val
,有一个私有变量(“val”)和一个getter方法(“def”)。变量初始化为一个值,该值计算一次
对于def
,没有变量“缓存”该值,因此每次都会计算该值
class Foo {
val bar = { println("BAR"); "bar" }
}
大致相当于
class Foo {
private var bar_ = { println("BAR"); "bar" }
def bar = bar_
}
当创建类的实例时,初始化条的块只执行一次。比如
val f = new Foo
println("Created")
f.bar
f.bar
f.bar
将打印出“BAR”,然后打印出“Created”,而不打印其他内容
但是如果您将Foo
定义为
class Foo {
def bar = { println("BAR"); "bar" }
}
然后,每次访问bar
时都会对该块求值,上面的代码将首先打印“已创建”,然后打印“bar”三次。对于val
,有一个私有变量(“val”)和一个getter方法(“def”)。变量初始化为一个值,该值计算一次
对于def
,没有变量“缓存”该值,因此每次都会计算该值
class Foo {
val bar = { println("BAR"); "bar" }
}
大致相当于
class Foo {
private var bar_ = { println("BAR"); "bar" }
def bar = bar_
}
当创建类的实例时,初始化条的块只执行一次。比如
val f = new Foo
println("Created")
f.bar
f.bar
f.bar
将打印出“BAR”,然后打印出“Created”,而不打印其他内容
但是如果您将Foo
定义为
class Foo {
def bar = { println("BAR"); "bar" }
}
然后,每次访问bar
时都会对该块进行求值,上面的代码将首先打印“已创建”,然后打印“bar”三次。调用def foo
时,原始val foo
的值实际上没有被“求值”;而是返回预先计算的结果,并且该结果只计算了一次。正如Dima的回答所示,当赋值比简单的Int
更复杂时,这种行为更为明显。调用def foo
时,原始val foo
的值实际上没有被“评估”;而是返回预先计算的结果,并且该结果只计算了一次。当赋值比简单的Int
更复杂时,这种行为更为明显,正如Dima的回答所示。