阶:如何从一个对象访问阴影函数变量(Scala: How to access a shadowed

2019-10-22 17:44发布

我想提出以下工作:

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

但我不知道如何从对象中引用X。 可以这样没有在这两个地点之一重命名X做了什么?

重命名变量时,例如,可能不容易foo是其中x为命名变量一种广泛使用的API的功能,同时obj延伸,其具有一个第三方性状x作为一个抽象的构件。

Answer 1:

为什么不引入具有相同的值作为新的变量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)


Answer 2:

不,这是不可能的。 有没有办法找出函数定义的外块。

对于你的语法工作FOO将不得不与一个成员谢这个工程的对象:

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

foo也可能是延长FunctionX一个单独的对象,这让你非常相似的方法什么的。 但它可能是更容易只是重命名值之一。



Answer 3:

这是不可能在Scala中。

你写的代码,所以最简单的选项将重命名的一个x S和问题就解决了。

但是,如果由于某种原因,你真的需要它-你可以做一招,并创建一个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()



文章来源: Scala: How to access a shadowed function variable from an object