1. ホーム
  2. スカラ

[解決済み】レイジーバルって何するもの?

2022-04-20 07:56:44

質問

私は、Scalaが提供する lazy vals . しかし、私は彼らが何をするのか理解できません。

scala> val x = 15
x: Int = 15

scala> lazy val y = 13
y: Int = <lazy>

scala> x
res0: Int = 15

scala> y
res1: Int = 13

REPL が示すように ylazy val とは異なりますが、通常の val ?

解決方法は?

両者の違いは val は定義された時点で実行されるのに対し lazy val は、初めてアクセスしたときに実行されます。

scala> val x = { println("x"); 15 }
x
x: Int = 15

scala> lazy val y = { println("y"); 13 }
y: Int = <lazy>

scala> x
res2: Int = 15

scala> y
y
res3: Int = 13

scala> y
res4: Int = 13

メソッドとは対照的に、( def ) a lazy val は一度だけ実行され、その後は二度と実行されない。これは、ある操作が完了するまでに時間がかかる場合や、その操作が後で使われるかどうかわからない場合に有効である。

scala> class X { val x = { Thread.sleep(2000); 15 } }
defined class X

scala> class Y { lazy val y = { Thread.sleep(2000); 13 } }
defined class Y

scala> new X
res5: X = X@262505b7 // we have to wait two seconds to the result

scala> new Y
res6: Y = Y@1555bd22 // this appears immediately

ここで、値 xy は決して使用されず、ただ x 不必要に資源を浪費することになる。もし仮に y は副作用がなく、どれくらいの頻度でアクセスされるのか(全くないのか、一度もないのか、何千回もあるのか)わからないので、それを def 何度も実行することはないでしょうから。

もし、どのように lazy vals は実装されています。 質問 .