【问题标题】:In Scala, what is the reasoning behind allowing parameter shadowing?在 Scala 中,允许参数隐藏的原因是什么?
【发布时间】: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


【解决方案1】:

有时语言包含一些特性并不是因为它们被认为是好的和有用的,而是因为根本没有人考虑过。

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 2011-09-09
    • 1970-01-01
    • 2016-03-29
    • 2013-10-26
    • 1970-01-01
    • 2021-05-17
    • 2014-06-20
    • 2014-01-08
    相关资源
    最近更新 更多