【发布时间】:2014-02-05 14:42:07
【问题描述】:
这对编译器来说是完全可以接受的(至少在 2.10.3 和 2.11-M7 中):
def foo(n: Int) = {
val n = 3
n * 3
}
...这可能是因为参数存在于方法/函数体的外部范围内,这是技术推理,但实际上,这可能会导致问题(正如我刚刚在现实生活中的代码中发现的那样),所以我想知道这是否只是语言设计的一个不可避免的结果,或者它是否真的服务于一个真正的(更高的?)目的。
附:甚至可以为阴影名称使用不同的类型:
def foo(n: Int) = {
val n = "hello"
n * 3
}
注意: 一个现有问题提出了一个类似但在概念上仍然非常不同的问题:Why does Scala support shadow variables? — 一般而言,它会询问名称阴影,而我关心的是阴影(出乎意料) 也发生在参数上,其中没有明显的子范围——是的,有大括号,但仍然(可以说)假设参数在同一范围内。
编辑:Haskell,模范或 FP 语言,也允许这样做:foo x = let x = 4 in x 是完全合法的。
【问题讨论】:
-
我不明白为什么它不可能。充其量,编译器可能会发出有关未使用参数的警告。此外,由于您没有显式设置返回类型,编译器只是从内部表达式中猜测它。
-
@Ashalynd:我没有说这是不可能的——恰恰相反:我在问为什么编译器默默地允许这样的构造。此外,返回类型的推断与问题完全无关。
-
我不知道为什么...但是,如果这种行为让您感到厌烦,那么 scalac 的
-Ywarn-shadowing高级选项至少应该会警告您 -
@ErikAllik 看起来您是对的,它一定已被删除。我只发现 issues.scala-lang.org/browse/SI-4762 在 2012 年之后似乎没有引起任何关注,所以它看起来像是一个已知问题,但并不被视为非常高优先级......
标签: scala