我认为这是 F# 的一个众所周知的限制,但我找不到任何好的解决方法……</p>
所以,这里是代码(我试图让它尽可能简单,所以它可能看起来没有任何意义):
[<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
,破坏一切的是数组属性 getter 的组合。
这里的要点是:
- 我真的很想使用数组,因为我希望 WebSharper 将我的集合转换为 JavaSript 数组。
- 我真的需要构造函数中的自我标识符。
- 我真的需要类(即功能样式不起作用)。
- 每个方法的自标识符 (
member this.Foo
) 工作正常。
我能想到的一种解决方法是将构造函数设为私有并使用静态方法来构造对象。这样我就不需要了as self
。但这只是愚蠢的。
有没有更好的选择?
更新:
这是一个更简单的例子:
[<ReflectedDefinition>]
type User (uid: int) as self =
let ROOT_UID = 0
member this.isRoot = (uid = ROOT_UID)
我as self
什至不能定义一个类常量。好吧,这实际上是一个单独的问题,但我会在这里问:在这种特殊情况下如何定义类常量?