2

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

var capital = Map("US" -> "Washington", "France" -> "Paris")

println(capital("France"))

现在让我们在Map之后添加一些新行,因为这样看起来好多了:

    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

那么Map有什么问题呢?scala 如何处理新行?我只是困惑。

编辑:我正在使用

scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL
4

1 回答 1

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 将继续读取更多行,希望您将键入更多代码来完成该块。

于 2013-01-06T17:32:29.560 回答