2010-10-25 31 views
117

在各種文獻斯卡拉我看到用「這個」一些自我型註釋和其他使用「自我」:自我註釋中的自我與自我之間的區別?

trait A { this: B => ... } 
trait A { self: B => ... } 

有沒有使用「這個」或「自我」之間的真正區別?你用什麼名字重要嗎?這是否有效?

trait A { foo: B => ... } 

回答

156

所有三種形式都是有效的,其效果是B被假定爲類別A中的類型。

前兩個變體

trait A { self: B => ... } 
trait A { foo: B => ... } 

介紹self(分別爲foo)如性狀A用於this的別名。這對於從內部類訪問this引用很有用。即當從嵌套在其中的類訪問特徵A時,您可以使用self而不是A.this。例如:

class MyFrame extends JFrame { frame =>  
    getContentPane().add(new JButton("Hide") { 
    addActionListener(new ActionListener { 
     def actionPerformed(e: ActionEvent) { 
     // this.setVisible(false) --> shadowed by JButton! 
     frame.setVisible(false) 
     } 
    }) 
    }) 
} 

第三變型中,

trait A { this: B => ... } 

this不會引入一個別名;它只是設置自我類型。

+0

我看自我類型的方式是,特質宣稱自己採取某種類型並返回代碼塊,例如foo:B => {...}。現在這些捲毛當然被省略了。有趣的是,在代碼中的任何範圍內,你都可以使用對象名稱而不是「this」來代替「this」,但是[javascript] – 2013-07-13 15:20:57

+4

@Martin Odersky是否可以爲兩個或更多特性添加限制,像'特質A {自我:B,C => ...}'? – 2014-11-05 08:57:37

+13

@DmitryBespalov:是的,您可以在自我打字的註釋中使用'with'關鍵字。例如'特質A {自我:B,C => ...} – Dave 2014-12-19 10:11:08

16

有一個區別在於this總是指由最內層模板定義的對象。

表達式this可以出現在模板或複合類型的語句部分。它表示由最內層的模板或複合類型定義的對象包含引用。如果這是一個複合類型,則this的類型就是該複合類型。如果它是簡單名稱C的類或對象定義的模板,則其類型與C的類型相同。 this。 (斯卡拉參考。§6.5)

所以,如果你打電話給你的自我型foo,你仍然可以把它稱爲this(當然,除非,你是在內部模板在這種情況下this將參考到它定義的對象 - 除非你不給內部模板的自我類型相同的名稱),但顯然不是相反的方式。