Это псевдоним для 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, где вы много делаете на внутренних классах (текстовые поля внутри полос прокрутки и т. д.), которые обычно имеют много методов с теми же именами, что и у внешних классов.