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 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 をモジュールに配置すると、フィールドはそのモジュールに対してプライベートになります。それが、モジュール内のトップレベルの宣言が動作することを期待する方法ですが、型内でプライベートに宣言されたものはすべて、それを囲むモジュールではなく、その型に対してプライベートになると予想していました。
この動作は実際には奇妙ですか、それともここで私の推論に何かが欠けていますか?