scala - Scala 奇怪的类/对象初始化
问题描述
我找不到为什么此代码会引发异常的答案assertProperChildren(Zoo2)
,但前提Zoo2.Tiger
是在进行断言之前访问了该异常。如果您评论该访问行,则所有断言都有效。对我来说没有意义。这是一个已知的 Scala 错误吗?
trait Domain {
abstract class ChildDomain
def children: Seq[ChildDomain]
}
// V1
abstract class Zoo1 extends Domain {
object Tiger extends ChildDomain
val children = Seq(Tiger)
}
object Zoo1 extends Zoo1
// V2
object Zoo2 extends Domain {
object Tiger extends ChildDomain
val children = Seq(Tiger)
}
// V3
object Zoo3 extends Domain {
object Tiger extends ChildDomain
lazy val children = Seq(Tiger)
}
object Main {
def main(args: Array[String]): Unit = {
def assertProperChildren(domain: Domain) = {
assert(!domain.children.contains(null))
}
Zoo1.Tiger
// Will NOT crash here, even if we touch Zoo1.Tiger before Zoo1
assertProperChildren(Zoo1)
Zoo2.Tiger
// Will crash here, but only if we touch Zoo2.Tiger before Zoo2
assertProperChildren(Zoo2)
// So if we want a scala object directly inheriting from a Domain
// we need lazy children:
Zoo3.Tiger
assertProperChildren(Zoo3)
}
}
解决方案
Scala 遵循初始化顺序,它在下面的链接中作为常见问题解答进行了解释。 https://docs.scala-lang.org/tutorials/FAQ/initialization-order.html
您可以将-Xcheckinit
其用作 scalac 标志的一部分。验证相同。
推荐阅读
- php - PHP:类/实例中的共享变量
- core-data - Swiftui CoreData 一对多关系
- reactjs - 在 React.js 中:是否可以只访问子组件的一部分?
- sql - Athena 计算两个表上的重复行
- android - 使用 Stripe Android SDK 的 Google Pay
- amazon-web-services - 在我违反 FreeTier 限制后,AWS CloudFront 是否停止工作
- visual-studio - 有没有办法从 Visual Studio 中的单个快捷方式运行多个命令而无需下载扩展程序?
- rest - 为嵌套资源设计rest api
- python - 烛台图显示没有输出
- python - 检查另一列熊猫中是否存在多列