Scala 2.10 を使用すると、以下はエラーなしでコンパイルされます。
val test = 1
try {
val test = 2
}
生成されたバイト コードを見ると、次のように表示されます。
int test = 1;
int test = 2;
これは奇妙ではありませんか?それとも、明らかな何かが欠けていますか?
ローカル変数は、より広いスコープを持つものと常に同じ名前を持つことができます。中括弧内で宣言することにより、他の場所で使用されている変数を誤って使用/上書きすることを効果的に防ぎます。奇妙ではありませんが、便利です。
これは とは関係ありませんtry
。変数は、任意のブロック内で互いにシャドーすることができ、ブロックは基本的にどこにでも配置できます。
val x = 0
if ({val x = 1; x*3}==0) {
val x = 2; x + x + x
}
else x
これにより、コードの移植性が向上します。外部の何かが競合することを心配することなく、ブロックを自由に移動できます。(まあ、完全に真実というわけではありません: どの暗黙変数がスコープ内にあるかによって問題が発生する可能性はありますが、重複した変数よりもつまずく可能性ははるかに低くなります。)
これは Java とは異なる選択です。Java の態度は、変数名を忘れる可能性が高く、思い出す必要があるというものですが、Scala の態度は、外部のコンテキストが変わっても、おそらくあなたが言っていることを意味しているというものです。Java が変更可能な操作 (変更可能な変数をシャドウすると実際に問題が発生する可能性があります!) に重点を置いており、Scala がデフォルトで不変であること (i や x などの短い変数を再利用できるため、外側の不変変数をシャドウすることはおそらく望ましいことです) を考えると、この種のことは理にかなっています。心ゆくまで)。
おそらく、何が起こっているのかを明確に把握するためにこれを試します
val test = 1
println(test)
try{
val test = 2
println(test)
}
println(test)
範囲が重要です。1
2
1
2番目test
はtryスコープ内にのみ存在することを期待しています