嘿所有,关于如何调用这个lambda或它实际上做什么的快速问题..
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))));
}
不幸的是,没有这个类的其余部分并且暂时没有使用Lambdas ..那个“ret”变量来自哪里?调用功能?它是否用于获取IEnumerable我可以看到编译器将其分配给onUnit接受的任何类型..?
解决方案:
ret =>用于将Spells.CanBuff转换为Decorator接受的委托类型。 onUnit也会接受委托函数参数。
答案 0 :(得分:2)
ret
变量是lambda表达式构建的委托(或表达式树)的参数。请注意,第一个lambda表达式的ret
与第二个lambda表达式中的ret
不同。
因此,创建了两个委托,并将它们传递给Decorator
构造函数,该构造函数可能存储它们以便稍后执行它们。调用每个委托时,调用者必须传递一个值,该值在lambda表达式执行期间可用作ret
参数。
如果没有看到Decorator
构造函数的签名是什么,那就很难说了。
我不太确定你的第二段代码的相关性是什么,我担心。
答案 1 :(得分:2)
lambda是一个匿名函数。因此,在您的情况下,ret
是函数的参数。
当你说
时Func<int, int> myFunc = (f) => f + 1;
您正在定义一个匿名函数,它接受一个int并返回它+ 1.您正在myFunc
引用中存储对匿名函数的引用。此功能尚未执行,只是已定义。您可以随时调用该函数:
int a = myFunc(4); // a becomes 5
Action<T>
是一个返回void的委托,通常指向像你这样的lambda。 Func<T1, T2>
是一个委托,它接受T1
并返回T2
,并且通常也指向一个lambda。还有其他方法为其他方法定义了更多参数,例如Func<T1, T2, T3>
和Action<T1, T2>
在你的情况下,你正在处理装饰器两个匿名函数。当它认为必要时,它会调用它们为它做一些工作,并使用返回值来进一步完成它自己的工作。