当存在具有相同名称的本地成员时,从外部作用域访问值

时间:2011-12-31 07:42:02

标签: scala

说我有一个属性为a的特征:

trait TheTrait {
  def a: String
}

我有一个属性为a的类,我想匿名实例化该特性:

class TheClass {
  val a = "abc"
  val traitInstance = new TheTrait {
    def a = a   // I want to assign it to the `a` of TheClass here
                // but this way it doesn't work
  }
}

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:22)

TheClass.this.a,或在this中为TheClass提供别名(称之为self是习惯的)

class TheClass { self => 
  val a = "abc"
  val traitInstance = new TheTrait {
    def a = self.a   
  }
}

答案 1 :(得分:1)

如果外部vals / vars位于功能块内,则解决问题的方法是将它们包装在匿名类中,为它们指定一个特定的名称。 S.A。

val a=1
val c = new { val a=a }    // does not compile

val s = new { val a=1 }
val c = new { val a=s.a }  // compiles :)

当然也只是使用不同的名称可以解决问题,但有些情况下,这意味着使用_ $等前缀/后缀。这是那些替代。