gpt4 book ai didi

scala:实例变量和对象初始化

转载 作者:行者123 更新时间:2023-12-05 03:15:11 24 4
gpt4 key购买 nike

我一直认为 scala 对象只是单例 java 对象的简写 - 也就是说,我希望它们的行为类似于具有保证单例实例化的对象。然后我遇到了这样的事情,我不明白:

object Test  extends App{
var x ="a"

override def main(args:Array[String]):Unit = {
println(x )
}
}

打印null而不是“a”。

查看生成的类,我得到一个 Test$.class,它是对象定义;然而,实例值“a”是使用生成的 delayedInit 在伴随测试类中定义的。有人可以阐明这是如何实例化的吗?显然,我对此的心智模型是错误的。

最佳答案

首先让我们看一下 App 及其工作原理。 documentation of App揭示以下警告:

It should be noted that this trait is implemented using the DelayedInit functionality, which means that fields of the object will not have been initialized before the main method has been executed.

It should also be noted that the main method will not normally need to be overridden: the purpose is to turn the whole class body into the “main method”. You should only chose to override it if you know what you are doing.

你的例子

好的,很好。现在我们知道了这两个事实,让我们修复您的代码。我们可以考虑两种可能的解决方案:

让我们只在知道自己在做什么时才覆盖 main 方法:

object Test extends App{
var x ="a"
println(x )
}

或者我们可以选择定义一个main方法,但不扩展App:

object Test {
var x ="a"

def main(args:Array[String]):Unit = {
println(x )
}
}

结论

您对对象的理解是正确的。令人困惑的是 DelayedInit App 实现。快乐编码;)

关于scala:实例变量和对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com