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

时间:2015-04-18 03:53:48

标签: function scala object shadowing

我想做以下工作:

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

但我不知道如何从对象中引用x。如果不在两个位置之一中重命名x,可以这样做吗?

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

3 个答案:

答案 0 :(得分:4)

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

为了使你的语法工作,foo必须是一个成员x的对象。即这有效:

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

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

答案 1 :(得分:1)

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()

一样使用它

答案 2 :(得分:0)

为什么不引入一个与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)