Ответ 1
Это псевдоним для this
.
Ваш первый пример полезен для обеспечения того, чтобы этот признак был смешан с соответствующим типом, и делает эти методы доступными.
Второй пример полезен, когда у вас есть внутренние классы с конфликтами именования, чтобы сделать видимым внешний вид. Например:
trait U {
self =>
val name = "outer"
val b = new AnyRef {
val name = "inner"
println(name)
println(this.name)
println(self.name)
}
}
Затем new AnyRef with U
печатает
inner
inner
outer
"self" не является специальным ключевым словом - вы можете использовать "bananas = > " или что угодно, но часто используется по соглашению.
В Swing это значительно разрастается, когда вы много делаете на внутренних классах (текстовые поля внутри scrollpanes и т.д.), которые обычно имеют много методов с теми же именами, что и внешние классы.