eclipse - 编译时scala如何处理新行?

标签 eclipse scala

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

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/

相关文章:

java - 根据 JAX-RS 中的规范使用带有 @PathParam 的 PathSegment?

安卓模拟器无法启动

eclipse - 泽西休息服务 : 'Resource/Servers is not open'

java - play2 framework 我的模板没见过。 : package views. html不存在

mysql - 仅当表不存在时如何执行 DDL?

java - 将带有处理元素的java程序导出到可执行jar

java - 无法在注释处理器中加载资源(不在类路径上)

scala - scala.concurrent.Promise 有哪些用例?

scala - 在 Scala 中拆分范围的好方法

java - “Thinking in Scala"如果我有 Java/C++ 背景?