Scala-VAL和Defs-反编译

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

如果在Scala中,此
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的回答所示。