【问题标题】:C# Lambda Return Statement QuestionC# Lambda 返回语句问题
【发布时间】:2010-12-02 15:50:48
【问题描述】:

大家好,关于如何调用这个 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 也可以接受委托函数参数。

【问题讨论】:

  • “这适用于上述函数还是 Lambda 以其他方式使用”是什么意思?
  • 你能告诉我调用 CreateBuffCheckAndCast 的正确方法,然后填充 ret lambda 变量吗?
  • 您没有填充 ret /parameter/。 CreateBuffCheckAndCast 没有返回任何 lambda 表达式,只是一个 Composite(它恰好是一个装饰器)。因此,您只能对它执行 Composite 可以执行的操作,无论您使用的库是什么。
  • 第二个代码示例具有完全不同的返回类型......它返回一个Action,这意味着一个将ISyncClient 作为参数并返回void 的Action。由于它返回一个动作,您可以在返回的 lambda 表达式中传递 sc 的参数。你不能对第一个代码 sn-p 这样做......就像我说的那样,它返回一个 Composite,而不是 Func 或 Action。
  • 明白,想要解释。我正在尝试学习代码,而不仅仅是使用库。所以谢谢!我不喜欢魔法密码。 =) 不太明白 lambda 的位置,但我现在明白了。

标签: c# lambda delegates anonymous-function


【解决方案1】:

ret 变量是 lambda 表达式正在构建的委托(或表达式树)的参数。请注意,第一个 lambda 表达式的 ret 与第二个 lambda 表达式中的 ret 不同。

因此,创建了两个委托,并将它们传递给Decorator 构造函数,该构造函数可能会存储它们以供以后执行它们。调用每个委托时,调用者必须传递一个值,该值在 lambda 表达式执行期间可用作 ret 参数。

没有看到 Decorator 构造函数的签名是什么,很难说更多。

恐怕我不太确定您的第二个 sn-p 代码的相关性是什么。

【讨论】:

  • 谢谢.. 非常快!第二个sn-p没有任何事情要处理第一个所以不要害怕哈哈。我试图展示我对使用 lambda(至少是表达式修饰符)的理解。 code.google.com/p/treesharp/source/browse/trunk/TreeSharp/… 我想我的问题是如何准确地调用它。我是否像往常一样调用函数,捕获返回“组件”,然后将其与将代替“ret”的参数一起使用。对不起,如果我离开了!
  • @BruceBannor:你调用什么函数?你有无数的事情可能想要调用,但你还没有真正解释你想要做什么......
  • 我只对这个函数感兴趣.. CreateBuffCheckAndCast。请忽略第二个 sn-p。那么你将如何调用该函数,从中调用委托? (我知道您没有制作任何委托功能等)
  • @BruceBannor:call CreateBuffCheckAndCast 你只需要所有相关参数的参数值。我们真的不知道这些委托类型是什么意思……但是您可以从 lambda 表达式或现有方法创建委托。实现使用 lambda 表达式这一事实应该与您无关。我们也不知道Composite 类型暴露了什么。基本上你是唯一一个知道所涉及类型的信息的人。我的建议是忽略 lambda 表达式并专注于 Composite 公开的内容。
  • 好的,这就是我一直在寻找的答案。抱歉,我正在跟上进度。感谢您的耐心等待!
【解决方案2】:

lambda 是一个匿名函数。所以在你的情况下,ret 是函数的参数。

当你说的时候

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

您正在定义一个匿名函数,它接受一个 int 并返回它 + 1。您正在将对该匿名函数的引用存储在 myFunc 引用中。这个函数还没有执行,它只是被定义了。您可以在以后随时调用该函数:

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

Action&lt;T&gt; 是一个返回 void 的委托,通常指向一个 lambda,比如你的。 Func&lt;T1, T2&gt; 是一个接受 T1 并返回 T2 的委托,通常也指向一个 lambda。还为其他方法定义了其他委托,这些方法采用更多参数,例如Func&lt;T1, T2, T3&gt;Action&lt;T1, T2&gt;

在您的情况下,您将两个匿名函数交给装饰器。当它认为有必要时,它会调用它们为它做一些工作,并使用返回值来推进它自己的工作。

【讨论】:

  • 谢谢,我明白了。我不太确定如何使用第一个 sn-p。复合 myComposite = CreateBuffCheckAndCast("blah", "blah");我的复合(retValue);哪里近?无法在 cmets 中获取要格式化的代码。
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 2013-12-25
  • 2015-04-22
  • 2020-04-11
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多