Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala初始化顺序(使用scalatest)_Scala_Sbt_Scalatest - Fatal编程技术网

Scala初始化顺序(使用scalatest)

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

如果有人能向我解释一下为什么以下情况会导致问题,我将不胜感激。我创建了一个小示例来演示这个问题:

我有一个我正在与sbt一起构建的项目,build.sbt如下所示:

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)
    }
}
如果I
sbt运行
,则会按预期打印出“2”。如果I
sbt测试
,则我得到一个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解决了这个问题。我想从现在起我将避免使用这个应用程序,除非我只是在一个对象中玩一些东西。谢谢