这是我从列表中查找最大值的代码
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表示什么?
我在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 和以前的版本之间创建不向后兼容的代码。