使用 Scala 2.10,以下编译没有错误。
val test = 1
try {
val test = 2
}
查看生成的字节码,我看到:
int test = 1;
int test = 2;
这不是很奇怪吗?还是我错过了一些明显的东西?
局部变量总是可以与范围更广的变量同名。通过在大括号内声明它,您可以有效地保护自己免于意外使用/覆盖在别处使用的变量。并不奇怪 - 但很有用!
也许您尝试这样做是为了清楚地了解正在发生的事情
val test = 1
println(test)
try{
val test = 2
println(test)
}
println(test)
范围很重要。我希望你得到1
2
1
第二个test
只存在于 try 范围内
这与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 这样的短变量,这种做法是有道理的随心所欲)。