我認爲這是F#的一個衆所周知的限制,但我找不到什麼好的解決辦法?F#報價,陣列和在構造函數中自我標識
所以,這裏是代碼(我試圖使它作爲簡單越好,所以可能看起來它沒有任何意義):
[<ReflectedDefinition>]
type Human (makeAName: unit -> string) as self =
let mutable cats : Cat array = [| |]
do
// get a cat
cats <- Array.append cats [| new Cat (self, makeAName()) |]
member this.Cats = cats
and
[<ReflectedDefinition>]
Cat (owner : Human, name : string) = class end
編譯器說:
錯誤FS0452:報價不包含內聯彙編代碼或圖案陣列
匹配
其實它是as self
和數組屬性獲取器的組合,它打破了一切。
的這裏的要點是:
- 我真的想用數組,因爲我想WebSharper到我的收藏轉化爲JavaSript陣列。
- 我真的需要構造函數中的自我標識符。
- 我真的需要類(即功能風格不起作用)。
- 按方法自標識符(
member this.Foo
)正常工作。
我能想到的一種解決方法是將構造函數設置爲private並使用靜態方法構造對象。這樣我不需要as self
。但它是愚蠢的。
有沒有更好的選擇?
更新:
這裏是一個更簡單的例子:
[<ReflectedDefinition>]
type User (uid: int) as self =
let ROOT_UID = 0
member this.isRoot = (uid = ROOT_UID)
隨着as self
我甚至不能定義一個類常量。那麼,這實際上是一個單獨的問題,但我會在這裏問:如何在這種特殊情況下定義類常量?
靜態構造函數 - 很好。談到第二個例子,好的,正確的,模塊常量可以工作,但我實際上是一個類常量,這就是爲什麼我想放在類中。讓類內的類常量(而不是污染模塊名稱空間)看起來是一個合理的事情。 – kirelagin 2013-03-29 05:16:36