当F#record';s字段被声明为私有
我刚刚注意到,当F#记录的字段部分被声明为私有时,有一种相当违反直觉的行为。(这与) 在这个例子中当F#record';s字段被声明为私有,f#,F#,我刚刚注意到,当F#记录的字段部分被声明为私有时,有一种相当违反直觉的行为。(这与) 在这个例子中 type MyRec = private // Fields declared private, or at least I thought so. { a : int b : int } member x.A = x.a member private x.Both = x.a + x.b static member Crea
type MyRec =
private // Fields declared private, or at least I thought so.
{ a : int
b : int }
member x.A = x.a
member private x.Both = x.a + x.b
static member CreateMyRec(a, b) = { a = a; b = b }
let foo = MyRec.CreateMyRec(1,2)
let bar = foo.a // No error. Huh?
let baz = foo.Both // Error: not accessible.
…私有成员Both
在类型声明范围之外是不可访问的,这是意料之中的。但是,可以访问字段a
如果将MyRec放入模块中,则字段将成为该模块的专用字段。这就是您希望模块中的顶级声明的行为方式,但我希望类型中任何声明为私有的内容都是该类型的私有内容,而不是其封闭模块的私有内容
这种行为是否真的很奇怪,或者我在这里的推理中遗漏了什么?据我所知,这是一个文档不足的特性。但是,规范第10.5节规定: 模块中的类型、模块或类型表示的专用表示“模块专用”
“类型表示”是与记录字段相关的部分。这是一个微妙的部分。如果没有你的回答,我是不会注意到的。