我想做以下工作:
def foo(x:Int = 1) = {
object obj {
val x = foo.this.x
}
}
但我不知道如何从对象中引用x。如果不在两个位置之一中重命名x,可以这样做吗?
重命名变量可能并不容易,例如,foo
是一个广泛使用的API函数,其中x作为命名变量,而obj
扩展了具有{{1}的第三方特征作为抽象成员。
答案 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)