【问题标题】:D: reduce with delegateD:与委托减少
【发布时间】:2014-08-30 09:39:04
【问题描述】:

这个sn-p的伪代码工作得很好:

RANGE.reduce!((a,b) => a + b);

事实上,它出现在多个示例和文档中。

但是,这不起作用,我不知道为什么:

RANGE.reduce!((a,b) => { return a + b; });

我不断收到以下错误:

algorithm.d(52,52): Error: cannot implicitly convert expression
    (__lambda1(result, _param_1.front()))
    of type int delegate() nothrow @nogc @safe
    to int

我认为这可能是 D 中的一个错误,但也许我错过了什么......?

(我的实际委托更复杂,我只是将代码简化为演示问题的最小示例)。

【问题讨论】:

    标签: d


    【解决方案1】:

    使用(a, b) => { return a + b; },lambda 是一个函数/委托,它返回一个函数/委托,而不是操作a + b 的结果。您应该使用不带 => lambda 运算符的 (a, b) { return a + b; } 使其行为符合您的要求。

    这可以使用以下代码查看:

    pragma(msg, typeof((int a, int b) => a + b).stringof);
    // prints "int function(int a, int b) pure nothrow @safe"
    
    pragma(msg, typeof((int a, int b) => {return a + b;}).stringof);
    // prints "int delegate() nothrow @safe function(int a, int b) pure nothrow @safe"
    
    pragma(msg, typeof((int a, int b) { return a + b; }).stringof);
    // prints "int function(int a, int b) pure nothrow @safe"
    

    所以你的代码应该是RANGE.reduce!((a, b) { return a + b; });

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多