在各種文獻斯卡拉我看到用「這個」一些自我型註釋和其他使用「自我」:自我註釋中的自我與自我之間的區別?
trait A { this: B => ... }
trait A { self: B => ... }
有沒有使用「這個」或「自我」之間的真正區別?你用什麼名字重要嗎?這是否有效?
trait A { foo: B => ... }
在各種文獻斯卡拉我看到用「這個」一些自我型註釋和其他使用「自我」:自我註釋中的自我與自我之間的區別?
trait A { this: B => ... }
trait A { self: B => ... }
有沒有使用「這個」或「自我」之間的真正區別?你用什麼名字重要嗎?這是否有效?
trait A { foo: B => ... }
所有三種形式都是有效的,其效果是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
不會引入一個別名;它只是設置自我類型。
有一個區別在於this
總是指由最內層模板定義的對象。
表達式
this
可以出現在模板或複合類型的語句部分。它表示由最內層的模板或複合類型定義的對象包含引用。如果這是一個複合類型,則this
的類型就是該複合類型。如果它是簡單名稱C的類或對象定義的模板,則其類型與C的類型相同。this
。 (斯卡拉參考。§6.5)
所以,如果你打電話給你的自我型foo
,你仍然可以把它稱爲this
(當然,除非,你是在內部模板在這種情況下this
將參考到它定義的對象 - 除非你不給內部模板的自我類型相同的名稱),但顯然不是相反的方式。
我看自我類型的方式是,特質宣稱自己採取某種類型並返回代碼塊,例如foo:B => {...}。現在這些捲毛當然被省略了。有趣的是,在代碼中的任何範圍內,你都可以使用對象名稱而不是「this」來代替「this」,但是[javascript] – 2013-07-13 15:20:57
@Martin Odersky是否可以爲兩個或更多特性添加限制,像'特質A {自我:B,C => ...}'? – 2014-11-05 08:57:37
@DmitryBespalov:是的,您可以在自我打字的註釋中使用'with'關鍵字。例如'特質A {自我:B,C => ...} – Dave 2014-12-19 10:11:08