lazyで値を遅延評価する
「val」で不変の値を定義する際に、「lazy」修飾子をつけると、値が遅延評価される(最初にアクセスされたときにのみ評価され、定義時には評価されない)ようになります。
- 「lazy」は「val」にのみ設定できます。「var」や「def」に設定することはできません。
- 値の評価は「最初にアクセスされたときに1回のみ」行なわれます。
- 複数回呼び出した場合、2回目以降は値の評価は行なわれず、初回の評価結果が返されます。
- ここが「def」と違うところですね。「def」でも値は遅延評価になりますが、値の評価は参照時に毎回行なわれます。
// lazyをつけると、値の評価が初回アクセス時にのみ行われるようになる。 lazy val a = { println("eval a"); "a" } // var や def には適用できない。 // 以下はコンパイルエラー // lazy var b = { "b" } // lazy def c = { "c" } println( "-- before --" ) println( a ) // 初回の参照。このとき初めてaの値が評価され、"eval a"と"a"が表示される。 println( a ) // 2回目以降は値の評価は行われない。"a"の表示される。
実行結果です。
-- before -- eval a a a