2012-03-02 1 views

答えて

2

と同等ですが、あなたは何かを行うことができます以下のような:

let (!?) p (x:obj) = 
    x.GetType().GetProperty(p).GetValue(x) 

let four = !?"Length" [5..8] 

これは、リフレクションを使用していますので、それはほど効率的ではありませんですが、それはあなたが探している表現力を与えるかもしれません。

+0

:あなたはコンパイル時にプロパティの名前を知っているし、あなたもする場合はプロパティは、任意の入力に存在していることを必要と

しかし、あなたはそうのようなF#の静的な制約を使用することができますこれは本当に私のpovのlangageにはありません。 rubyではnamelist.map(&:length)になります。非常に簡潔です。 – nicolas

+1

@Nicolas - 間違いなく、明示的なラムダを避けるのが良いことがあることは間違いありません。もちろん、プロパティの代わりにレットバインド関数を使用する場合は、それを行うことができます(例えば、 'namelist |> List.map length')。 – kvb

+3

キースが言ったように、いいえ、これについての構文はありません。それはいいだろう。 – Brian

1

kvbのソリューションは、一般的なケース(実行時にプロパティ名を指定できるようにしたい)で動作する唯一のソリューションです。

// Define the 'toto' operator 
let inline toto (a : ^a) = 
    (^a : (member Toto: string with get) (a)) 

type MyType() = 
    member __.Toto with get() = "Toto" 

// Create an instance of MyType 
let t = MyType() 

printf "The song is 'Africa', by %s" (toto t) 
関連する問題