Scala变量范围问题
我有一个scala语法问题——假设我有一个简单的依赖模式构造,如下所示Scala变量范围问题,scala,Scala,我有一个scala语法问题——假设我有一个简单的依赖模式构造,如下所示 trait Master { val foobar object SubObject extends SubObject { foobar = foobar } } trait SubObject { val foobar } 显然,这不会编译,因为引用 foobar=foobar 这是模棱两可的 如何指定表达式的RHS应该引用Master的foobar变量?“this”或“self”是否有
trait Master {
val foobar
object SubObject extends SubObject {
foobar = foobar
}
}
trait SubObject {
val foobar
}
显然,这不会编译,因为引用
foobar=foobar
这是模棱两可的
如何指定表达式的RHS应该引用Master的foobar变量?“this”或“self”是否有我应该知道的特殊用法?您可以使用
主控符。此限定符专门引用外部范围,如下所示:
trait Master {
val foobar = "Hello world"
object SubObject extends SubObject {
val foobar = Master.this.foobar
}
}
trait SubObject {
val foobar:String
}
我相信最简单的方法是使用自类型定义。除了一些很酷的类型理论效果之外,您还可以使用self类型为“this”创建别名。(尚未对此进行测试)
嗯,也许不是最简单的方法,你应该给Andrzej的解决方案打勾,但是你也应该知道self-type的别名技巧。在一些棘手的边缘案例中很有用我最初开始使用self类型和一个简单的蛋糕模式,最终我可能会回到这个模式,但我希望有一个简单的环境对象,它可以为我创建所有的东西,而不必混合到所有需要的东西中。另外,我不一定喜欢将“对象”用于这种依赖项注入形式(或者,实际上,用于除伴随对象以外的任何对象)。说“lazy val subObject=new subObject{foobar=master.foobar}”这样的话稍微不那么冗长
trait Master {
master =>
val foobar
object SubObject extends SubObject {
foobar = master.foobar
}
}
trait SubObject {
val foobar
}