2

これは、F#クラスの構文に関する非常に基本的な質問です。これが私の問題を説明するための小さなコードです。

type AClass() as self =
    member this.Something = printfn "Hello"

基本的に、私が読んだ「as self」から、クラス全体で使用できる現在のインスタンスの名前が作成されます(C#やJavaの「this」など)。ただし、「member this.Something」は同じことを行いますが、スコープがメソッド本体に限定されているだけです。どの構文をいつ使用するかがわかると思います。「自己として」の1つは、コンストラクターなどで必要な場合に使用でき、もう1つは、コンストラクターで必要ない場合に使用できます。

しかし、「自己として」構文を使用した場合でも、なぜ「memberthis.Something」構文を使用する必要があるのでしょうか。「memberSomething」と書くだけでエラーが発生するのはなぜですか?私は何を逃しましたか?

気をつけて、カー

4

3 に答える 3

2

グローバル'asxxx'とメンバー'yyy'の違いはすべてあるようです。インスタンスバインディングが整理されました。ですから、あなたの答えに対する答えは、「設計による」ものでなければならないと思います。

人々は、この「設計による」選択の背後に意図的な合理性があると主張しますが、私のお気に入りの言語であるF#を4年間プログラミングした後、私は個人的にそれがどの点でもあまり役に立たないと感じました。

言語が変数への明示的なインスタンスバインディングを必要とする本当の理由は、基礎となる.NETCIL実装をより厳密に反映しているためだと思います。つまり、C#のような言語は、「this」を機能としてクラス定義のインスタンスにバインドします。内部的には、クラスの静的メソッドとインスタンスメソッドの両方が、CallおよびCallVirtオペコードを使用して同じ方法で呼び出されます。インスタンスメソッドの場合、「this」のアドレスが呼び出しの最初の引数としてロードされます。

しかし、私たちは確かに味と意見の領域に挑戦しました。

于 2012-08-26T13:29:42.437 に答える
2

のスコープはas selfクラス全体ですが、のスコープthis.Somethingは個々のメソッドにすぎません。as selfを使用するだけthis.Somethingで十分なので、頻繁には必要ありません。

メンバー宣言が必要な理由についてはthis.、F# クラスでは let 境界と静的メソッドも使用することが多いため、当然の選択だと思います。デフォルトとして持つselfと、混乱と誤用の原因になります。

一般的な IMO ではないMSDNas selfでの使用例を次に示します。

type MyClass2(dataIn) as self =
   let data = dataIn
   do
       self.PrintMessage()
   member this.PrintMessage() =
       printf "Creating MyClass2 with Data %d" data
于 2012-08-26T10:43:22.993 に答える
0

これは決して重複ではないと思います。selfクラス全体に対する の可視性は、F# のプライマリ コンストラクターの "インテリジェントな" コンパイルの副産物です。コンストラクターの引数/バインディングは、ローカル フィールドとメンバー (クラス レベル) フィールドの両方に暗黙的にコンパイルできます。as identifier構文thisは、そのミュータント コンテキスト内での参照を容易にするだけです。未使用の場合は、コンパイルされていると思います。それ以外の場合は、追加の参照をメンバー フィールドとして格納するthisだけです (これは、C# などの別の言語では奇妙に思えます)。

于 2012-08-26T22:00:52.797 に答える