質問

情報を読んだだけです このページ, 、そして新しいですか?オペレーターが言及されていますが、その使用法がどうなるかはまったく不明です。
誰でも簡単な説明を提供し、このオペレーターがどのように使用されるかについてのコードを投稿して、おそらくユースケースに言及してもらえますか?
編集: :これは本当に厄介です、私はそれに気づいたのですか?オペレーターは、Donのリリースノートではもはや言及されていません。なぜそれがなぜですか?

役に立ちましたか?

解決

このf#リリースには(?)と(?< - )には、2つの新しい「特別な」演算子があります。それらは定義されていませんが、過負荷に使用できるため、自分で定義できます。特別なビットは、彼らが2番目のオペランドをどのように扱うかです。彼らはそれを有効なf#識別子であることを要求しますが、それを渡して、オペレーターを文字列として実装する機能です。言い換えると:

a?b

脱着しています:

(?) a "b"

と:

a?b <- c

脱着しています:

 (?<-) a "b" c

これらのオペレーターの非常に単純な定義は次のとおりです。

let inline (?) (obj: 'a) (propName: string) : 'b =
    let propInfo = typeof<'a>.GetProperty(propName)
    propInfo.GetValue(obj, null) :?> 'b

let inline (?<-) (obj: 'a) (propName: string) (value: 'b) =
    let propInfo = typeof<'a>.GetProperty(propName)
    propInfo.SetValue(obj, value, null)

Gettorの返品タイプは一般的であるため、ほとんどの場合、使用するサイトで指定する必要があることに注意してください。

let name = foo?Name : string

あなたはまだチェーンコール(?)ができますが((?)の最初の引数はジェネリックであるため):

let len = foo?Name?Length : int

もう1つのより興味深い実装は、VBが提供するCallByNameメソッドを再利用することです。

open Microsoft.VisualBasic    

let inline (?) (obj: 'a) (propName: string) : 'b =
    Interaction.CallByName(obj, propName, CallType.Get, null) :?> 'b //'

let inline (?<-) (obj: 'a) (propName: string) (value: 'b) =
    Interaction.CallByName(obj, propName, CallType.Set, [| (value :> obj) |])
    |> ignore

その利点は、プロパティとフィールドの両方を正しく処理し、Idispatch comオブジェクトなどで動作することです。

他のヒント

「?」のように聞こえますオペレーターは、動的言語ランタイム(DLR)に関連しています。つまり、コンパイル時間ではなく、実行時にオブジェクトメンバー(メソッド、プロパティ)にバインドする場合に使用します。

これがC#でも動的なメンバーの呼び出しがどのように機能するかを望んでいたので、それは面白いです。残念ながら、C#は「擬似」タイプ(「動的」IIRC)を介してこの機能を公開します。私の意見では、これにより、コードがやや明確になりません(変数宣言を追跡して、通話が早期に縛られているか遅いかを知る必要があるため)。

正確な構文はわかりませんが、推測する必要がある場合は、「」を置き換えるか補強します。 (DOT)オペレーター。のように:

let x = foo?Bar()

または多分:

let x = foo.?Bar()

モジュールがあります fsharp.interop.dynamic, 、DLRを使用して動的演算子を実装するNugetで。

let ex1 = ExpandoObject() in
ex1?Test<-"Hi";
ex1?Test |> should equal "Hi";

それはオープンソース、Apacheライセンスです、あなたは 実装 ユニットテストが含まれています 例の場合.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top