我这里有这段代码,一切都很好:
var capital = Map("US" -> "Washington", "France" -> "Paris")
println(capital("France"))
现在让我们在 map 之后添加一些新行,因为这样看起来更好:
var capital = Map
(
"US" -> "Washington",
"France" -> "Paris"
)
println(capital("France")) //error
Eclipse 给我一个错误消息:类型不匹配;发现:java.lang.String("France") 必需:(?, ?) Start.scala/ScalaProject/src 第 11 行 Scala 问题
呃,为什么呢?仅仅因为我在新行后添加了这些内容?实际上我可以做到这一点而不会出现任何错误消息:
var capital = Map("US" -> "Washington", "France" -> "Paris")
println(
capital
(
"France")) //no error
那么 map 有什么问题呢? scala 如何处理新行?我只是很困惑。
编辑:我正在使用
scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL
最佳答案
在 REPL 中输入行时(不确定 Eclipse),会尝试任何本身有效的行。
var capital = Map
是有效的,所以其余的被解释为一个单独的语句(它实际上使用映射创建一个 Tuple2,然后丢弃它们,因为它们没有分配给任何东西)。在 shell 中(或 :paste
模式下的 REPL),它会临时尝试连接行,然后一切正常。
为了在 REPL 中解决这个问题,并符合惯用的 Scala 风格,您应该在上一行中保留左大括号和圆括号:
var capital = Map(
"US" -> "Washingtion",
"France" -> "Paris"
)
如果你有某种类型的开放 block ,编译器将任意地寻找关闭;如果 REPL(不在 :paste
模式下)发现连续两个空行,则会放弃,但会跳过一个。
val works = Map(
1 -> "one"
)
val fails = Map(
2 -> "two"
)
但请注意,失败
仅在该行完全为空时才会失败;如果行上甚至有一个空格(例如通过缩进放置),REPL 将继续读取更多行,希望您键入更多代码来完成该 block 。
关于eclipse - 编译时scala如何处理新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184710/