2012-08-26 149 views
2

這是關於F#類語法的一個非常基本的問題。這裏有一個小代碼來說明我的問題。需要幫助瞭解F#類語法

type AClass() as self = 
    member this.Something = printfn "Hello" 
從我讀了「自我」將創建一個名稱,它可以在整個類中使用(如「本」,在C#或Java)當前實例

基本上。但是「member this.Something」會做同樣的事情,只是範圍限於方法體。我想我可以看到你什麼時候會使用哪種語法。如果你在構造函數中需要它,或者可以使用「as self」,如果你在構造函數中不需要它,你可以使用另一個。

但是,即使我使用「as self」,爲什麼還要使用「member this.Something」語法?爲什麼如果我只寫「member Something」會給我一個錯誤?我錯過了什麼?

保重, 克爾

+0

實際上,這只是一小部分的重複,因爲大多數時候你想要避免「自我」。 –

回答

2

as self範圍是整個類,而this.Something範圍僅僅是一個單獨的方法。你不經常需要as self,因爲使用this.Something就足夠了。

關於爲什麼你需要this.在成員聲明中,我認爲這是一個自然的選擇,因爲在F#類中,你經常也有界限和靜態方法。將self設爲默認會導致混淆和誤用。

這裏是MSDN使用as self一個例子,這是不常見IMO:

type MyClass2(dataIn) as self = 
    let data = dataIn 
    do 
     self.PrintMessage() 
    member this.PrintMessage() = 
     printf "Creating MyClass2 with Data %d" data 
+0

那麼它或多或少都是無害重複的情況?思考它使我意識到,它可能更好的是一致的,然後有一個非常聰明的編譯器,可以確定何時「這個」。應該是需要的。避免混淆。當我在構造函數中需要它時使用「this」,我會使用「as self」。別處。謝謝 :)。 – Kerr

2

這聽起來像你有「爲XXX」和成員全球的所有分歧,「YYY」。實例綁定整理出來。所以我想你的答案的答案必須是「通過設計」。

人們會爭辯說在這個「按設計」選擇背後有一個有意識的理性,但是經過4年的編程F#,我迄今爲止最喜歡的語言,我個人沒有發現它在任何方面都非常有幫助。

我懷疑語言需要將顯式實例綁定到變量的真正原因是因爲它更接近地反映了底層的.NET CIL實現。也就是說,像C#這樣的語言將「this」與類定義的實例綁定爲一個特性。在這種情況下,類的靜態方法和實例方法都使用Call和CallVirt操作碼以相同的方式調用,在實例方法中,「this」的地址作爲第一個參數加載到調用中。

但是我們肯定已經進入品味和意見領域。

0

我不認爲這是重複的。 self對整個班級的知名度是F#主要構造函數的「智能」彙編的副產品。構造函數的參數/綁定可隱式編譯爲本地和成員(類級別)字段。 as identifier語法僅促進該突變體上下文中的引用。我冒昧地猜測,如果沒有使用,它會被編輯掉。否則,你所做的只是將一個額外的引用存儲爲this作爲成員字段(這在另一種語言中看起來很奇怪,例如C#)。