运行 在新应用程序中测试时发生 Scala 错误。不能展开宏?

Scala error when running test in new application. can't expand macros?

我正在尝试学习 Scala、scalatest 和 sbt 的基础知识,并且正在学习教程。这是我的 built.sbt 文件:

name := "demo-hello"

version := "0.1"

scalaVersion := "2.12.6"

libraryDependencies += "org.scalatest" % "scalatest_2.10" % "2.1.0" % "test"

我有一个看起来像这样的测试(显示这可能是不必要的:

package demo

import org.scalatest.FunSuite

class HelloTest extends FunSuite {
  test("say hello method works correctly") {
    val hello = new Hello
    assert(hello.sayHello("Scala") == "Hello, Scala!")
  }
}

我应该从这里做什么?我正在尝试 运行 测试,但出现此错误:

Error:(8, 36) can't expand macros compiled by previous versions of Scala
    assert(hello.sayHello("Scala") == "Hello, Scala!")

顺便说一句,我对 % 符号不是很熟悉。

FIX

我将 build.sbt 更改为:

name := "demo-hello"

version := "0.1"

scalaVersion := "2.10"

libraryDependencies += "org.scalatest" % "scalatest_2.10" % "2.1.0" % "test"

剩余问题:

  1. 所以降级到 scalaVersion“2.10”似乎有效。为什么?
  2. 什么是神器? scalatest 明显是神器?
  3. scalaversion 2.10 在我的机器上保存在哪里?看来我只有 scala 2.12。我的项目文件夹中的哪个版本是 2.10?

回答你的问题有点乱:

2 - "artifact" 是由 maven、sbt 或其他构建系统构建的。对于 Scala 或 Java,这几乎总是一个 jar 文件。 libraryDependencies 中的每个项目都指定了 Maven 存储库(工件数据库)中的一个文件。

1 - Scala class 文件在次要版本的 Scala 之间不兼容。当您从 Maven 存储库下载 Scala jar 时,Scala 版本被指定为工件名称的一部分。依赖项中的 _2.10 声明您希望使用为 Scala 2.10 编译的 scalatest 版本 - 这就是为什么您在 Scala 2.12 应用程序中使用它时出错的原因。

在 sbt 中声明对 Scala 工件的依赖时,您应该始终使用 %% 运算符,它会自动将适当的后缀附加到您的工件,如下所示:

// This works for any scalaVersion setting.
libraryDependencies += "org.scalatest" %% "scalatest" % "2.1.0" % "test"

3 - sbt 自动处理为声明的 Scala 版本下载适当的运行时文件。