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

Явные саморекламы без типа/разности с ''this''

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

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

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

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

trait T {
  self =>
  ...
}

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

4b9b3361

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

Ответ 2

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

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

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