我想做以下工作:
def foo(x:Int = 1) = {
object obj {
val x = foo.this.x
}
}
但我不知道如何从对象中引用 x 。这可以在不重命名两个位置之一的 x 的情况下完成吗?
例如,当foo
一个广泛使用的 API 函数以 x 作为命名变量时,重命名变量可能并不容易,同时扩展了作为抽象成员obj
的 3rd 方特征。x
不,这是不可能的。无法识别函数定义的外部块。
为了使您的语法正常工作, foo 必须是具有成员 xie 的对象,这有效:
class foo{
val x = 1
object obj {
val x = foo.this.x
}
}
foo
也可以是扩展 FunctionX 的单例对象,它为您提供非常类似于方法的东西。但是重命名其中一个值可能更容易。
这在 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()
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)