我这里有这个代码,一切都很好:
var capital = Map("US" -> "Washington", "France" -> "Paris")
println(capital("France"))
现在让我们在地图之后添加一些新行,因为它看起来好得多:
var capital = Map
(
"US" -> "Washington",
"France" -> "Paris"
)
println(capital("France")) //error
Eclipse给出了错误消息:type mismatch; found:java.lang.String("France") required: (?, ?) Start.scala /ScalaProject/src line 11 Scala Problem
var capital = Map("US" -> "Washington", "France" -> "Paris")
println(
capital
(
"France")) //no error
那么地图有什么问题? scala如何处理新行?我只是困惑。
编辑:我正在使用
scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL
答案 0 :(得分:5)
当在REPL中输入行(不确定Eclipse)时,会尝试任何可能有效的行。
var capital = Map
是有效的,所以其余的被解释为一个单独的语句(它实际上创建了一个带有映射的Tuple2,然后丢弃它们,因为它们没有分配给任何东西)。在shell(或:paste
模式下的REPL)中,它暂时尝试加入这些行,然后一切正常。
要在REPL中解决这个问题 - 并遵循惯用的Scala样式 - 你应该在前一行留下开括号和圆括号:
var capital = Map(
"US" -> "Washingtion",
"France" -> "Paris"
)
如果你有某种类型的开放块,编译器将任意寻找一个关闭; REPL(不在:paste
模式下)如果在一行中找到两个空行但跳过一行,则会保释。
val works = Map(
1 -> "one"
)
val fails = Map(
2 -> "two"
)
但请注意fails
只有在完全为空的行时才会失败;如果行上有一个空格(例如通过缩进放置),REPL将继续读取更多行,希望你打算输入更多将完成该块的代码。