Ответ 1
либо TheClass.this.a
, либо дать псевдоним this
в TheClass
(его вызов self
является обычным)
class TheClass { self =>
val a = "abc"
val traitInstance = new TheTrait {
def a = self.a
}
}
Скажем, у меня есть черта с свойством 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
}
}
Как я могу это достичь?
либо TheClass.this.a
, либо дать псевдоним this
в TheClass
(его вызов self
является обычным)
class TheClass { self =>
val a = "abc"
val traitInstance = new TheTrait {
def a = self.a
}
}
Если внешние 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 :)
Конечно, просто использование разных имен могло бы сделать трюк, но бывают случаи, когда это означает префикс/постфинирование с _ $и т.д. Это альтернатива для них.