1

我想做以下工作:

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

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

例如,当foo一个广泛使用的 API 函数以 x 作为命名变量时,重命名变量可能并不容易,同时扩展了作为抽象成员obj的 3rd 方特征。x

4

3 回答 3

4

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

为了使您的语法正常工作, foo 必须是具有成员 xie 的对象,这有效:

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

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

于 2015-04-18T04:58:15.483 回答
1

这在 Scala 中是不可能的。

您编写代码,因此最简单的选择是重命名其中一个xs 并解决问题。

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

于 2015-04-18T16:49:50.440 回答
0

foo为什么不直接引入一个与's argument具有相同值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)
于 2015-04-19T00:43:09.850 回答