2010-12-02 7 views
1

ねえすべて、このラムダまたは何それが実際にを呼び出す方法についての簡単な質問..C#のラムダreturn文の質問

public Composite CreateBuffCheckAndCast(string name, UnitSelectDelegate onUnit, CanRunDecoratorDelegate extra) 
{ 
    return new Decorator(
     ret => Spells.CanBuff(name, onUnit(ret)) && extra(ret), 
     new Action(ret => Spells.Buff(name, onUnit(ret)))); 
} 

は、残念ながら、このクラスの残りの部分を持っていないとでラムダを使用していませんしばらくの間、 "ret"変数はどこから来ますか?呼び出し関数は? IEnumerableを取得するために使用されていますか?onUnitが受け入れる型をコンパイラに割り当てることができます。

ソリューション:

RET =は>デコレーターによって受け入れられるようにデリゲート型にSpells.CanBuffを変換するために使用されます。 onUnitはデリゲート関数のパラメータも受け入れます。

+0

「これは上記の機能に適用されるのですか、ラムダは別の方法で使用されていますか? –

+0

CreateBuffCheckAndCastを呼び出し、ret lambda変数を設定する正しい方法を教えてくれますか? – BruceBannor

+0

ret/parameter /に値を設定しません。 CreateBuffCheckAndCastから返されているラムダ式はありません。コンポジット(デコレータになります)だけです。ですから、あなたが使用しているライブラリ用のものであれ、Compositeが行うことができることだけができます。 –

答えて

2

ret変数は、ラムダ式が構築しているデリゲート(または式ツリー)のパラメータです。最初のラムダ式のretは、2番目のラムダ式のものとは異なるretであることに注意してください。

したがって、2つのデリゲートが作成され、Decoratorコンストラクタに渡されます。これらのコンストラクタは、おそらく後で実行するために格納されます。各デリゲートが呼び出されると、呼び出し側はラムダ式の実行中にretパラメータとして使用できる値を渡す必要があります。

Decoratorコンストラクタのシグネチャが表示されていないと、これ以上は言い難いです。

コードの2番目のスニペットとの関連性がわかりません。恐れがあります。

+0

ありがとう..非常に速い! 2番目のスニペットは最初のものを扱うものがないので、恐れてはいけません。私はラムダ(表現修飾子)を使用することの理解を示すように努力していました。 http://code.google.com/p/treesharp/source/browse/trunk/TreeSharp/Decorator.cs 私の質問は正確にそれを呼び出す方法です。私は通常のように関数を呼び出し、 "Component"の戻り値をキャプチャし、 "ret"の代わりに使うパラメータでそれを使用しますか?申し訳ありませんが私は途方もない場合! – BruceBannor

+0

@BruceBannor:あなたは何の機能を呼びますか?あなたは電話したいと思っているかもしれないものをたくさん持っていますが、実際にあなたがしようとしていることは説明していません。 –

+0

私はこの関数に興味があります.. CreateBuffCheckAndCast。 2番目のスニペットを無視してください。あなたはその関数をどのように呼び出すのですか?その代理人を呼びますか? – BruceBannor

2

ラムダは無名関数です。あなたのケースでは、retが関数のパラメータです。あなたはint型を取り、あなたがmyFunc参照で無名関数への参照を格納している+ 1を、それを返す匿名関数を定義している

Func<int, int> myFunc = (f) => f + 1; 

言うん

。この関数は実行されていません。定義されています。あなたが好きいつでも後から機能を呼び出すことができます。

int a = myFunc(4); // a becomes 5 

Action<T>はvoidを返すと、通常、あなたとラムダを指すデリゲートです。 Func<T1, T2>は、T1を受け取り、T2を返すデリゲートで、通常はラムダを指します。 Func<T1, T2, T3>Action<T1, T2>のような他のメソッドに対して定義された他の代理人があります。

デコレータの2つの匿名関数を渡しています。必要があると判断したときには、その作業のために何らかの作業を行い、戻り値を使用して作業を進めます。

+0

ありがとう、私はそれを得た。私はどのように最初のスニペットを使用するかについてはあまりよく分かりませんでした。 複合myComposite = CreateBuffCheckAndCast( "blah"、 "blah"); myComposite(retValue); どこでも近いですか?コメントで書式設定するコードを取得できません。 – BruceBannor