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 を作成し、それらは何にも割り当てられていないため破棄します)。シェル (または:pasteモードの REPL) では、暫定的に回線を結合しようとしますが、その後はすべて問題ありません。

REPL でこの問題を回避するには (そして慣用的な Scala スタイルに準拠するには)、前の行に左中括弧と括弧を残す必要があります。

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

なんらかのオープン ブロックがある場合、コンパイラは任意にクローズを探します。REPL (:pasteモードではない) は、行に 2 つの空白行が見つかった場合に救済されますが、1 つをスキップします。

val works = Map(

  1 -> "one"
)

val fails = Map(


  2 -> "two"
)

ただし、行が完全に空failsの場合にのみ失敗することに注意してください。行にスペースさえあれば (例えば、インデントしてそこに入れる)、REPL は、ブロックを終了するコードをさらに入力することを期待して、より多くの行を読み続けます。

于 2013-01-06T17:32:29.560 に答える