7

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

この動作は実際には奇妙ですか、それともここで私の推論に何かが欠けていますか?

4

1 に答える 1

11

私が知る限り、これは十分に文書化されていない機能です。ただし、仕様のセクション 10.5 のAccessibility Annotationsには、次のように記載されています。

型、モジュール、またはモジュール内の型表現のプライベートは、「モジュールに対してプライベート」を意味します。</p>

「型表現」は、レコード フィールドに関連する部分です。

于 2013-01-22T15:26:41.090 に答える