Scala - Vals和Defs - 反编译

时间:2018-02-07 13:22:40

标签: scala decompiling

如果在Scala中,此.my_svg_element { max-width: 250px; max-height: 400px; } 被反编译为:

val foo: Int = 0

那么private[this] val foo_: Int = 0 def foo: Int = foo_ 每次调用它们时如何评估,但def只被评估一次?由于val无论如何被反编译为val

1 个答案:

答案 0 :(得分:6)

对于val,有一个私有变量(“val”)和一个getter方法(“def”)。变量用一个值初始化,该值计算一次。

对于def,没有变量来“缓存”该值,因此每次都会计算它。

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

大致相当于

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

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

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

将打印出“BAR”,然后“创建”,而不是其他任何内容。

但是如果你将Foo定义为

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

然后每次访问bar时都会评估该块,并且上面的代码将首先打印“已创建”,然后“BAR”三次