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”是否有

我有一个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 = "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
}