lazy
val するときにつけると、参照されるまで右辺の評価が「遅延」する。
簡単な例
var i = 0 def countup = {i = i + 1; i} def reset = {i = 0; i} def test { lazy val a = countup lazy val b = countup lazy val c = reset lazy val d = countup lazy val e = a + b println("a = " + a) println("b = " + b) println("c = " + c) println("d = " + d) println("e = " + e) } test
結果は
a = 1 b = 2 c = 0 d = 1 e = 3
通常だとコンパイル出来ない相互参照になる場合に使える。
def test2 { lazy val aa = true || bb lazy val bb:Boolean = aa && false println("aa = " + aa) println("bb = " + bb) } test2
結果は
aa = true bb = false
これは、lazyをとってしまうとコンパイル出来ない。
error: forward reference extends over definition of value aa val aa = true || bb