Scala初始化顺序(使用scalatest)
如果有人能向我解释一下为什么以下情况会导致问题,我将不胜感激。我创建了一个小示例来演示这个问题: 我有一个我正在与sbt一起构建的项目,build.sbt如下所示:Scala初始化顺序(使用scalatest),scala,sbt,scalatest,Scala,Sbt,Scalatest,如果有人能向我解释一下为什么以下情况会导致问题,我将不胜感激。我创建了一个小示例来演示这个问题: 我有一个我正在与sbt一起构建的项目,build.sbt如下所示: lazy val root = (project in file(".")). settings( name := "Test", version := "1.0.0", scalaVersion := "2.11.5", libraryDependencies
lazy val root = (project in file(".")).
settings(
name := "Test",
version := "1.0.0",
scalaVersion := "2.11.5",
libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % Test
)
和src/main/scala中的Test.scala:
object Test extends App
{
private val map = Map(1 -> 2)
def access = map(1)
println(access)
}
和src/test/scala中的TestSpec.scala(使用scalatest):
import org.scalatest.FlatSpec
class TestSpec extends FlatSpec
{
"A Test" should "allow access to the map" in
{
assert(Test.access == 2)
}
}
如果Isbt运行
,则会按预期打印出“2”。如果Isbt测试
,则我得到一个NullPointerException,测试失败:
[info] TestSpec:
[info] A Test
[info] - should allow access to the map *** FAILED ***
[info] java.lang.NullPointerException:
[info] at Test$.access(Test.scala:4)
[info] at TestSpec$$anonfun$1.apply$mcV$sp(TestSpec.scala:7)
etc.
这是因为当TestSpec访问map时,它是空的。我可以通过将map更改为lazy val或def来解决这个问题,但是我想知道更多关于这里的初始化顺序的细节,以及我将来如何避免这种情况。如果我尝试使用src\main\scala中的另一个源文件访问它,我不会有任何问题,我希望避免以这种方式更改变量的定义来解决此类问题
谢谢我不知道答案,但研究它很有趣 显然,trait应用程序有点特别 应该注意的是,这个特性是使用 DelayedInit功能,这意味着对象的字段将 在执行main方法之前尚未初始化 这就是答案!:)取消应用程序并定义一个显式的main解决了这个问题。我想从现在起我将避免使用这个应用程序,除非我只是在一个对象中玩一些东西。谢谢