Scala:如何从对象访问阴影函数变量

Scala: How to access a shadowed function variable from an object

我想做以下工作:

def foo(x:Int = 1) = {
  object obj {
    val x = foo.this.x
  }
}

但我不知道如何从对象中引用 x。这可以在不重命名两个位置之一的 x 的情况下完成吗?

重命名变量可能并不容易,例如,foo 是一个广泛使用的 API 函数,其中 x 作为命名变量,而 obj 扩展了第 3 方特征具有 x 作为抽象成员。

不,这是不可能的。无法识别函数定义的外部块。

要使您的语法生效,foo 必须是具有成员 x 的对象。即这有效:

class foo{
  val x = 1
  object obj {
    val x = foo.this.x
  }
}

foo 也可以是扩展 FunctionX 的单例对象,它为您提供了非常类似于方法的东西。但重命名其中一个值可能更容易。

在 Scala 中是不可能的。

您编写代码,所以最简单的选择是重命名 x 之一,问题就解决了。

但是,如果出于某种原因您确实需要它 - 您可以做一个技巧并创建一个 object 其行为与您的方法

object Foo {
  self =>

  val x = 1

  def apply() = {
    object obj {
      val x1 = self.x
      val x2 = Foo.x
      // x1 == x2, just 2 different ways of doing this
    }
  }
}

因为实现了 apply 方法,所以您可以像使用函数一样使用它 Foo()

为什么不引入一个与 foo 的参数 x 具有相同值但不被隐藏的新变量?

def foo(x: Int): Unit = {
  val foo_x = x
  object obj {
    val x = 13
    def doStuff: Unit = printf("%d %d\n", x, foo_x);
  }
  obj.doStuff
}

foo(42)