scala在编译时如何处理新行?

时间:2013-01-06 17:24:28

标签: eclipse scala

我这里有这个代码,一切都很好:

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

1 个答案:

答案 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将继续读取更多行,希望你打算输入更多将完成该块的代码。