Подтвердить что ты не робот

Доступ к значению из внешней области, когда присутствует локальный член с тем же именем

Скажем, у меня есть черта с свойством 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
  }
}

Как я могу это достичь?

4b9b3361

Ответ 1

либо TheClass.this.a, либо дать псевдоним this в TheClass (его вызов self является обычным)

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

Ответ 2

Если внешние 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 :)

Конечно, просто использование разных имен могло бы сделать трюк, но бывают случаи, когда это означает префикс/постфинирование с _ $и т.д. Это альтернатива для них.