9

私は最近、F#のオブジェクト指向の側面を学ぼうとしていて、その言語の型/モジュールへのアクセスを制限する方法に興味を持っています。

より具体的には、これを書くことの違いを知りたいです:

Example.fsi

module Stack =
    val foo : string

Example.fs

module Stack =
    let foo = "foo"
    let bar = "bar"

代わりにこれ:

module Stack =
    let foo = "foo"
    let private bar = "bar"

彼らは最終的にまったく同じことを達成しませんか?C#のバックグラウンドを持っているので、署名(FSI)ファイルに対してアクセス修飾子を使用する傾向があります。それらはより用途が広いようです(たとえば、名前空間のモジュール/タイプに適用できます)が、署名ファイルがアクセス修飾子が提供しないものを提供する状況はありません。

4

1 に答える 1

13

彼らはほとんど同じことを成し遂げます。(名前空間の型にも.fsiファイルを使用できることに注意してください。それについてのコメントが何を意味するのかわからなかったのです。)

署名ファイルにはいくつかの利点があります。

  • publicファイルの期間中はエンティティを作成できprivateますが、その後はプロジェクトの後続のファイルに対して作成できます。
  • 署名ファイルに短い要約だけを含めることができるため、大量のコードをスキャンしなくても、パブリックインターフェイスを簡単に読み取ることができます。

最初の箇条書きはささいなことではありません-このようなアセンブリ内のカプセル化は、実際には非常に大規模なプロジェクトにとって非常に大きな機能です。File1.fs内で相互に公開されているいくつかの型を定義できるが、それらの型/メソッドのサブセットのみを残りの型(File2.fs、File3.fsなど)に公開できることは非常に便利です( C ++の「友達」に少し似ています)。

于 2009-10-06T17:29:55.237 に答える