使用Scala 2.10,以下编译没有错误。为什么scala try块允许重新定义封闭范围的变量?
val test = 1
try {
val test = 2
}
望着生成的字节码,我看到:
int test = 1;
int test = 2;
这难道不奇怪吗?还是我错过了明显的东西?
使用Scala 2.10,以下编译没有错误。为什么scala try块允许重新定义封闭范围的变量?
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的态度是,你更可能忘记你的变量名称,需要提醒,而斯卡拉的说法是,即使外部环境发生变化,你的意思可能就是你所说的。考虑到Java对可变操作的关注(遮蔽可变变量真的会导致问题!)和Scala的默认不变性(隐藏外部不可变变量可能甚至是可取的,因为您可以重用像i和x这样的短变量到你心中的内容)。
谢谢!我会接受你的回答,因为令我感到困惑的事情是scala和java之间的区别,我认为你提供了一个合理的解释。我在创建一个可变变量时遇到了这个问题,然后不小心将其映射到了我的try块中,而不是将它分配给它。我想我应该看一些处理异常的更习惯的scala模式,:P – zakvdm 2013-02-21 10:01:56
局部变量可以始终与具有较宽范围的名称相同。通过将它声明在括号内,可以有效防止意外地使用/覆盖别处使用的变量。不奇怪 - 但有用!
也许你试试这个得到什么在
val test = 1
println(test)
try{
val test = 2
println(test)
}
println(test)
范围的事项要清晰的画面。我希望你得到了1
2
1
第二test
只有尝试范围
它被称为阴影,可以在任何设置中通过在'{'braces'}'中包含一系列表达式来创建新的内部作用域。 – 2013-02-20 14:46:49
我知道这不是真的,但是用Scala我假装'{'和'}'定义了一个函数。这使得我个人更容易理解这些结构。 – EECOLOR 2013-02-20 21:55:28