这是在 scala.2.8.1
我有一个对象配置。其中有一个惰性值,database
.
样品 A:
import Config.database
trait Dao {
protected val database = database
}
样品 B:
import Config
trait Dao {
protected val database = Config.database
}
在config中,相关代码为:
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 中评估数据库的顺序不同。
我认为这不应该是正确的行为。当然这不是直观的。如果这不是错误,有人可以解释为什么选择这种行为吗?
具体行为是在惰性 val 内部,将 var 设置为某个值。在示例 A 中,var 的设置晚于示例 B 中的设置。
编辑所以我才意识到我得到了val database = database
. 因此,更改导入会导致变量隐藏,尽管我希望自引用 val 应该发出编译器警告,或者溢出堆栈?