2015-09-19 47 views
1

我刚刚发现了一个在IntelliJ IDEA中自动重命名方法参数引入的bug。其结果是,争论是由同名的本地VAL方法体内的阴影,就像这样:为什么方法体中的顶级val在Scala中影响方法参数?

def foo(arg: Int): Int = { 
    val arg = 1 
    arg 
} 

assert(foo(2)) // fail 

(更糟糕的是,编译器并没有因为得到可疑类型不安全==,我用来比较这个值)。

是否有任何可能的为什么Scala会允许通过方法体的顶层的值来影响方法参数?

编辑:是否有一个编译器选项,我可以用来避免这些事情发生?

+0

我的猜测是,这是允许的“方便”的人从Java的未来在那里方法的参数可以被重新分配。 – ghik

+0

但是你不能'val arg = arg + 1',所以我在这里没有看到任何方便...... –

+1

Scala允许一般的阴影;它并没有真正选择和选择阴影是和不被允许的特殊情况。至少,我想不出任何情况。 –

回答

0

看来函数参数被认为是来自更高级别的作用域。

当然有点反直觉。不过,如果你写了一点不同的它可能使一个没有多大意义:

def foo = { (arg: Int) => 
    val arg = 1 

    arg 
} 
相关问题