2017-05-04 15 views
1

スカラセミコロン:以下の条件のいずれかが真でない限り、要するに推論の例は、「Scalaでプログラミング」セミコロン推論規則導入

は、ライン終了をセミコロンとして扱われる:

  1. 問題の行は、ピリオドや中置演算子などの文の終わりとしては合法ではない単語で終わります。
  2. 次の行は、文を開始できない単語で始まります。
  3. 行は、かっこ(...)または角かっこ[...]で囲まれていますが、これは複数のステートメントを含むことはできないためです。

しかし、私は2番目の条件で、誰が例を挙げることができるという例は見つけられませんか? *次のコードを試しました。*はステートメントを開始できませんでしたが、失敗しました。

1 * 2 
    *3 
+0

'いくつかの(2).MAP {F => F * 2 }' 申し訳ありませんが、SOコメント緩いインデント。とにかく... '=>'を新しい行に入れた場合 – mfirry

+0

'*'は文を開始できないと思いますか? http://scala-lang.org/files/archive/spec/2.13/01-lexical-syntax.html#newline-charactersを慎重に読んでください:(** bold ** emphasis mine):「Theステートメントを始めることができるトークンは、次のデリミタと予約語を除くすべてのScalaトークン** *です:catch、else、extend、finally、forSome、match、 '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' ) '、'] '、'} '"となります。 '*'はそのリストには表示されません。なぜでしょうか?メソッド呼び出しは、ステートメントを開始すると完全に合法です。 –

答えて

3

「Scalaでプログラミング」セミコロン推論規則を導入:

    :要するに

    次の条件のいずれかが真でなければ、ライン終了をセミコロンとして扱われます

  1. 問題の行は、ピリオドや中置演算子のように、文の終わりとしては合法ではない単語で終わります。
  2. 次の行は、文を開始できない単語で始まります。
  3. 行は、かっこ(...)または角かっこ[...]で囲まれていますが、これは複数のステートメントを含むことはできないためです。

これはかなり単純な表示です。完全なルールはScala Language Specificationsection 1.2 Newline Charactersです。

しかし、第2の条件では、誰が例を挙げることができるのかという例は見つかりませんか?SLSによると

  • catch
  • 文を始めることができ、トークンは、すべてのScalaは除いて、次の区切り文字と予約語をトークンありますelse

  • extends
  • finally
  • forSome
  • match
  • with
  • yield
  • ,
  • .
  • ;
  • :
  • =
  • =>
  • <-
  • <:
  • <%
  • >:
  • #
  • [
  • )
  • ]
  • }

ので、一つの例は次のようになります。

return 42 
.toString() 

これは

return 42.toString(); // returns the `String` "42" 
に相当します

ない

return 42; // returns the `Int` 42 
.toString() // dead code 

*文を起動することはできませんので、私は次のコードを試してみましたが、それは失敗しました!

1 * 2 
*3 

あなたは*文を起動しないことができると思いますか?スペックを注意深く読んでください。

foo(bar) 

が有効である、とそう

*(3) 

エルゴ、*文を開始することができます:メソッドの呼び出しは、文始まる完全に合法です。完全例:

object Test 
    def test = { 
    1 * 2 
    *(3) 
    } 

    def *(x: Int) = { 
    println(x) 
    x + 1 
    } 
} 

Test.test 
// 3 
//=> res0: Int = 4