2011-11-09 61 views
29

沒有類型/差異自我引用我的理解使用了explicitly typed self-references明確用「」這個'

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

在體內,self是一個別名this但有更精確的類型T with T2

現在,我已經看到了這個代碼:

trait T { 
    self => 
    ... 
} 

也就是說,沒有額外的類型信息,明確自己的參考。在這種配置下,有沒有self不只是this的別名?

回答

35

這是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 

「自我」不是一個特殊的關鍵字 - 您可以使用「香蕉=>」或任何你喜歡的,但它經常使用的約定。

這莊稼了在Swing相當多,在這裏你就內部類很多(scrollpanes內文本框等),通常具有相同的名稱作爲外部類的許多方法。

+2

好的,謝謝。所以在這種情況下,它相當於更長的形式'U.this.name',我猜。 – Philippe

7

在這種情況下self是說this的另一種方式。

如果你碰巧有一個內部類,然而,this裏面的內部類將是內部類,self將是容器類。

這是唯一的區別AFAIK

+0

,也許它的目的。 – kboom