【问题标题】:Scala: accessing shadowed parameter/variableScala:访问阴影参数/变量
【发布时间】:2015-06-26 09:56:38
【问题描述】:

我有以下代码,以及 2 种情况 里面

  1. if 在方法 hideVariableFromOuterBlock 我声明一个 变量k 遮蔽了外部定义的那个 阻止。
  2. 在第二种方法hideParameterName 中,我声明了一个变量k,它会隐藏同名参数。
object Test extends App {
  def hideVariableFromOuterBlock() = {
    var k = 2457
    if (k % 2 != 0) {
      var k = 47
      println(k) // this prints 47
      //println(outer k)
    }
    println(k) // - this prints 2457 as expected
  }

  def hideParameterName(k: Int) = {
    var k = 47
    println(k) // this prints 47
    //println(parameter k)
  }

  hideVariableFromOuterBlock()
  hideParameterName(2457)
}

在我隐藏变量或参数k 的块中是否有任何方法可以访问被隐藏的值(来自外部块的变量)?

我知道这不是一个好习惯,我永远不会那样做。我问这个问题是为了教育目的。

我做了一些研究,但没有找到明确的解释。我可以清楚地发现/看到发生了阴影,但没有明确解释无法再访问外部块中的变量。

我是 Scala 的新手。

【问题讨论】:

  • 我首先要说 var 在惯用的 Scala 中不是最有趣的。
  • 我同意你的看法,据我研究,至少_ 比var 和其他东西更有趣。
  • 我的意思是更惯用的解决方案往往会避免可变值。

标签: scala


【解决方案1】:

This 回答首先讨论了为什么允许使用阴影。

至于访问阴影值的方法,据我所知,最简单的方法是重命名内部变量,问题就消失了。我想,为了练习,如果你真的不想重命名任何东西,你可以将外部变量分配给一个具有不同名称的新变量。

var k = 2457
val outer_k = k
if (k % 2 != 0) {
  var k = 47
  println(k) // this prints 47
  println(outer_k)
}

【讨论】:

  • 您提到的答案虽然非常有力,但表达了对为什么允许使用阴影的个人意见。此外,很明显如何通过将值复制到另一个变量/常量来修复代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多