Eclipse scala在编译时如何处理新行?
我这里有这个代码,一切都很好:Eclipse scala在编译时如何处理新行?,eclipse,scala,Eclipse,Scala,我这里有这个代码,一切都很好: var capital = Map("US" -> "Washington", "France" -> "Paris") println(capital("France")) 现在让我们在贴图之后添加一些新行,因为这样看起来更好: var capital = Map ( "US" -> "Washington", "France" -> "Paris" ) printl
var capital = Map("US" -> "Washington", "France" -> "Paris")
println(capital("France"))
现在让我们在贴图之后添加一些新行,因为这样看起来更好:
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
那么地图的问题是什么?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"
)
如果你有一个某种类型的开放块,编译器会任意地寻找一个封闭块;如果REPL(不在:粘贴模式下)在一行中找到两个空行,它将跳转,但将跳过一行
val works = Map(
1 -> "one"
)
val fails = Map(
2 -> "two"
)
但是请注意,失败
只有在该行完全为空时才会失败;如果行上甚至有空格(例如,通过缩进放在那里),REPL将继续读取更多行,希望您键入更多代码来完成该块。只是想知道,为什么PRINNT(大写/新行/新行)以后不会出现大括号问题(您有一个开括号,因此编译器会一直查找,直到找到匹配的close、换行符或no。它还能明智地做什么?