Явные самостоятельные ссылки без типов / различий с '' this '' - PullRequest
34 голосов
/ 10 ноября 2011

Я понимаю использование для явно введенных собственных ссылок :

trait T {
  self : T2 =>
  ...
}

В теле self является псевдонимом для this, но имеет более точный тип T with T2.

Теперь я видел это в коде:

trait T {
  self =>
  ...
}

То есть явная ссылка на себя без дополнительной информации о типе.Есть ли в этой конфигурации ситуация, в которой self - это не просто псевдоним для this?

Ответы [ 2 ]

43 голосов
/ 10 ноября 2011

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

9 голосов
/ 10 ноября 2011

В этом случае self - это еще один способ сказать this.

Если у вас есть внутренний класс, однако, this внутри внутреннего класса будет внутренним классом, а self будет контейнерным классом.

Это единственное отличиеAFAIK

...