结果证明编译器完全可以接受(至少在2.10.3和2.11-M7中):
def foo(n: Int) = {
val n = 3
n * 3
}
...这可能是因为参数存在于方法/函数体的外部范围内,这是技术推理,但实际上,这可能会导致问题(正如我刚才在现实代码中发现的那样) ),所以我想知道这是否只是语言设计的一个不可避免的后果,或者它是否真的服务于真正的(更高的?)目的。
P.S。甚至可以使用不同的类型作为阴影名称:
def foo(n: Int) = {
val n = "hello"
n * 3
}
注意:现有问题提出了一个类似但仍然在概念上非常不同的问题:Why does Scala support shadow variables? - 一般会询问名称阴影,而我则关注阴影这一事实(意外地)也发生了参数,没有明显的子范围发生 - 是的,有大括号,但仍然(可以说)假设参数在同一范围内。
编辑: Haskell,示例或FP语言,也允许这样做:foo x = let x = 4 in x
完全合法。
答案 0 :(得分:1)
有时语言包含的功能不是因为它们被认为是好的和有用的,而是因为根本没有考虑过。