如果在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
?
答案 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”三次