これはscala.2.8.1にあります
オブジェクト構成があります。その中には、怠惰な val がありdatabase
ます。
サンプル A:
import Config.database
trait Dao {
protected val database = database
}
サンプル B:
import Config
trait Dao {
protected val database = Config.database
}
構成では、関連するコードは次のとおりです。
lazy val database =
somethingFromAFile match {
case "a" => databaseA
case "b" => databaseB
case "c" => databaseC
}
lazy val databaseA = makeDB("a")
lazy val databaseB = makeDB("b")
lazy val databaseC = makeDB("c")
var changes = throw new Exception ("Not yet initialised")
private def makeDB(db: String) = {
db match {
case "a" => var changes = x => 2*x; ... //database making stuff
case "a" => var changes = x => 3*x; ...
case "a" => var changes = x => 4*x; ...
}
}
サンプル A とサンプル B では、データベースが評価される順序が異なり
ます。正しい動作ではないと思います。確かに直感的ではありません。これがバグでない場合、誰かがこの動作が選択された理由を説明できますか?
特定の動作は、lazy val 内で、var が特定の値に設定されることです。サンプル A では、var がサンプル B よりも遅く設定されています。
編集だから、私は持っていることに気づきましたval database = database
。したがって、インポートを変更すると、変数のシャドウイングが発生しましたが、自己参照 val がコンパイラの警告を発するか、スタックをオーバーフローするはずだと思いますか?