Scala测试意外错误,')'预期,但'}'发现

时间:2017-03-16 12:11:46

标签: scala sbt

这是我从列表中找到最大值的代码

object kp {
    def main(args: Array[String]) {

def max(xs: List[Int]): Int = xs match {
  case Nil => throw new java.util.NoSuchElementException()
  case List(x: Int) => x
  case x :: y :: rest => max( (if (x > y) x else y) :: rest )
} 

val a = 1 :: 4 :: 5 :: -4:: Nil
println(max(a))

}
}

当我想用sbt

测试示例文件夹中的代码时
[info] Compiling 1 Scala source to /home/milenko/example/target/scala-2.11/classes...
[error] /home/milenko/example/src/main/scala/example/ListsSuite.scala:138: ')' expected but '}' found.
[error]   }
[error]   ^
[error] /home/milenko/example/src/main/scala/example/ListsSuite.scala:148: ')' expected but '}' found.
[error]   }
[error]   ^
[error] two errors found

错误参考

  test("maximum with one negative number") {
    assert(max(List(1,4,5,-4)) === 5 )
  }

  test("maximum with some repeated elements"){
    assert(max(List(2,2,2,2)) === 2 )
  }

我不知道为什么会发生这种情况。这是整个文件

http://www.filedropper.com/listssuite

现在我已从文件中删除了一些测试,它只有135行。但我得到了相同的

wc -l ListsSuite.scala 
135 ListsSuite.scala
milenko@milenko-desktop:~/example/src/test/scala/example$ cd ~/example
milenko@milenko-desktop:~/example$ sbt
[info] Loading global plugins from /home/milenko/.sbt/0.13/plugins
[info] Loading project definition from /home/milenko/example/project
[info] Set current project to progfun1-example (in build file:/home/milenko/example/)
> test
[info] Compiling 1 Scala source to /home/milenko/example/target/scala-2.11/classes...
[error] /home/milenko/example/src/main/scala/example/ListsSuite.scala:138: ')' expected but '}' found.
[error]   }
[error]   ^
[error] /home/milenko/example/src/main/scala/example/ListsSuite.scala:148: ')' expected but '}' found.
[error]   }
[error]   ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 1 s, completed 16/03/2017 13:43:43

很奇怪,做什么:138和:148表示?

1 个答案:

答案 0 :(得分:0)

我在filedropper链接中看不到任何内容(也许它已过期了?),但我知道导致类似编译器错误的一个错误是一个尾随逗号。我不认为这是你的问题,但了解编译器正在做什么可能对你的情况有所帮助。

这是一个简单的文件Comma.scala

val map = Map(
  1 -> "one",
  2 -> "two", // <--- comma after last argument
)

尝试使用scala 2.11编译它:

$ scala Comma.scala
Comma.scala:4: error: illegal start of simple expression
)
^
Comma.scala:4: error: ')' expected but eof found.
)
 ^
two errors found

第二个错误就像你的错误。

我的猜测是:

  • "illegal start of simple expression"是因为它期望在最后一个逗号之后有一个表达式(例如3 -> "three"),但是它遇到了结束括号而不是它认为不是有效的表达式
  • 因为关闭括号在解析Map(..)的参数时被更早消耗,当编译器完成处理参数时,它会上升一级以找到Map(的结束')',但命中其他东西(在我的情况下,文件结尾,在你的情况下是一个封闭的代码块中的'}'。这会产生错误')' expected but ... found

第二个错误与你的第二个错误匹配,因此它可能指向出现问题,它解析你的参数并吃掉你的结束括号。消息本身是一个红色的鲱鱼,因为当真正的问题可能更早时,它指向结束括号。

如果你是一个习惯于使用尾随括号的python开发人员,这会导致很多人头疼!

我有一个案例,其中scala 2.12编译器实际上可以处理尾随逗号,但遗憾的是我无法使用适合SO的小例子来重现它。遗憾的是,这种微小的差异会在2.12和之前的版本之间创建非向后兼容的代码。