2011-11-09 14 views

Odpowiedz

35

Jest aliasem this.

Twój pierwszy przykład jest przydatny do zapewnienia, że ​​cecha została wymieszana z odpowiednim typem i udostępnia te metody.

Drugi przykład jest przydatny, gdy masz wewnętrzne klasy z konfliktami nazw, aby zewnętrzny zakres był widoczny. Na przykład:

trait U { 
    self => 
    val name = "outer" 
    val b = new AnyRef { 
    val name = "inner" 
    println(name) 
    println(this.name) 
    println(self.name) 
    } 
} 

Następnie new AnyRef with U nadrukami

inner 
inner 
outer 

„ja” nie jest specjalnym słów kluczowych - można użyć „banany =>” lub cokolwiek chcesz, ale to często wykorzystywane przez konwencję.

To bardzo często pojawia się w Swing, gdzie robisz dużo na wewnętrznych klasach (textboxach na scrollpanach, itp.), Które zwykle mają wiele metod o takich samych nazwach jak zewnętrzne klasy.

+2

Dobre punkty, dzięki. W tym przypadku jest to odpowiednik dłuższej formy "U.this.name", jak sądzę. – Philippe

7

W takim przypadku self to inny sposób powiedzenia: this.

Jeśli jednak masz klasę wewnętrzną, to wewnątrz klasy wewnętrznej znajduje się klasa wewnętrzna, a klasa kontenera to self.

To jedyna różnica AFAIK

+0

I prawdopodobnie jego cel. – kboom

Powiązane problemy