val
- 変数は、以下の性質を持つべき価値の潜在的な複数の割り当てとScalaのコンパイラの取引は、コンパイル時に確保方法、遅くともランタイムで:Scalaでは
- 不変変数を使用することはできません(中 "読み込み ")してからバインドされます。
- immutable変数は、一度割り当てられた後に再度割り当てることはできません。
チュートリアルとドキュメントによれば、タイプが指定されている限り、宣言ポイントにすぐにval
を割り当てる必要はありません。
- http://www.tutorialspoint.com/scala/scala_variables.htm
- http://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html#value-declarations-and-definitions
しかし、これは、割り当てが単数であるかどうかを予測することはコンパイラに不可能だこれらの両方の例で
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}
であるべきですか?
与えられた例はScalaでコンパイルされません。 –
Pattern2は段落8.1で定義されています –