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