在Scala中,允许参数阴影的原因是什么?

时间:2014-02-05 14:42:07

标签: scala

结果证明编译器完全可以接受(至少在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完全合法。

1 个答案:

答案 0 :(得分:1)

有时语言包含的功能不是因为它们被认为是好的和有用的,而是因为根本没有考虑过。