3

http://www.artima.com/pins1ed/builtin-control-structures.html#7.7に、次のコードが表示され ます

val a = 1;
{
  val a = 2
  println(a)
}
println(a)

ここではセミコロンが必要だと言っていますが、なぜですか?

http://www.artima.com/pins1ed/classes-and-objects.html#4.2のルールから、セミコロンを自動追加する必要があると思います。

  1. val a = 1法的声明である可能性があります。
  2. 次の行は で始まります{。法的声明を開始できると思います。(セミコロンを追加して最初の 2 行を 2 つのステートメントに分ければ、コンパイル エラーが発生しないためです。)
  3. val a = 1括弧または括弧内にありません。
4

1 に答える 1

5

への正当な呼び出しになるためapply:

implicit class RichInt(i: Int) {
  def apply(thunk: => Unit) = 33
}

val a = 1
{
  val a = 2
  println(a)
}
println(a)  // 33 !

1 { ... }の略です1.apply {...}。デフォルトでapplyは は定義されていませんIntが、暗黙のエンリッチメントが示すように、完全に可能です。


編集: セミコロンの推論条件は、 Scala 言語仕様の「§1.2 改行文字」に記載されています。推論されたセミコロンは、そのテキストでは「特別なトークン " nl"」と呼ばれます。

一般に、3 つのルールが与えられ (このブログ エントリでex-negativo に要約されています)、あなたの例ではそれらはすべて満たされています。セミコロンがまだ推測されない理由は、テキストのさらに下に示されています。

Scala grammar ... には、オプションのnlトークンが受け入れられるが、セミコロンは受け入れられないプロダクションが含まれています。これには、これらの位置のいずれかにある改行が [!] 式またはステートメントを終了しないという効果があります。

このような追加ルールの関連ケースは次のとおりです。

単一の改行トークンが受け入れられます
– 左中括弧「{」の前で、その中括弧が現在のステートメントまたは式の正当な継続である場合 ...

例 1.2.2 は、コメントで参照した匿名のサブクラスの場合を示しています。

于 2013-09-03T15:39:58.293 に答える