2016-08-04 4 views
1

val - 変数は、以下の性質を持つべき価値の潜在的な複数の割り当てとScalaのコンパイラの取引は、コンパイル時に確保方法、遅くともランタイムで:Scalaでは

  1. 不変変数を使用することはできません(中 "読み込み ")してからバインドされます。
  2. immutable変数は、一度割り当てられた後に再度割り当てることはできません。

チュートリアルとドキュメントによれば、タイプが指定されている限り、宣言ポイントにすぐにvalを割り当てる必要はありません。

しかし、これは、割り当てが単数であるかどうかを予測することはコンパイラに不可能だこれらの両方の例で

def fn1(x: Int, y: Int): Int = { 
    val const2 : Int 

    const2 = 0 
    if (x < 10) const2 = x 
    if (y > 10) const2 = y 

    const2 
} 

def fn2(x: Int, y: Int): Int = { 
    val const2 : Int 
    var i: Int 

    for(i <- x to y){ 
    const2 = 0 
    } 

    const2 
} 

抜け穴を作るように見えますかない。したがって、コンパイラはこのコードのコンパイルを禁止する立場を持っていませんが、実行時に実行可能なすべての実行パスに単一変数の代入を保証する根拠はありません。

どのようなコンパイラでも、コードをコンパイルするか、エラーをスローする代わりに、間違った側で終了する可能性があります。だから、それは何をすべきか、仕様上の賢明さ?

PS。文書による軽微な質問:4.1章には、
PatDef ::= Pattern2 {‘,’ Pattern2}
なぜ「パターン2」が繰り返され、同じ数値インデックスを持つのでしょうか? 代わりにPattern {‘,’ Pattern}か、おそらくPattern1 {‘,’ Pattern2}であるべきですか?

+1

与えられた例はScalaでコンパイルされません。 –

+1

Pattern2は段落8.1で定義されています –

答えて

1

これは違法です:

val const2 : Int 
const2 = 0 

val sが宣言、期間後に再割り当てすることはできません。

+0

クラスメンバシップを追加すると、未定義メンバを宣言できます。しかし、それでも私はOPによって提供されるようなシナリオを作成することはできないと思います。 –

+0

@SarveshKumarSingh宣言することはできますが、宣言した後で代入することはできません。 –

+0

しかし、2行目で行われる代入なしで、 'const2'の値は何ですか?宣言外の割り当てが一度でも禁止されているという仕様を引用できますか? –