1

使用 Scala 2.10,以下编译没有错误。

val test = 1
try {
  val test = 2
}

查看生成的字节码,我看到:

int test = 1;
int test = 2;

这不是很奇怪吗?还是我错过了一些明显的东西?

4

3 回答 3

3

局部变量总是可以与范围更广的变量同名。通过在大括号内声明它,您可以有效地保护自己免于意外使用/覆盖在别处使用的变量。并不奇怪 - 但很有用!

于 2013-02-20T12:27:11.993 回答
2

也许您尝试这样做是为了清楚地了解正在发生的事情

val test = 1
println(test)
try{
  val test = 2
  println(test)
}
println(test)

范围很重要。我希望你得到1 2 1 第二个test只存在于 try 范围内

于 2013-02-20T12:31:26.433 回答
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 这样的短变量,这种做法是有道理的随心所欲)。

于 2013-02-20T17:37:49.907 回答