在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
}

注意:现有问题在概念上提出类似但仍然非常不同的问题:为什么Scala支持影子变量? - 一个人一般询问了遮蔽名称的信息,而我关心的是,阴影(出乎意料的是)也发生在参数中,没有明显的子分割发生 - 是的,有些卷曲括号,但可以说是一个(可以说是一个说话))假设参数处于同一范围。

编辑: haskell,示例或fp语言,也允许这样做: foo x = let x = 4 in x是完全合法的。

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

最新更新