D:用代表减少

时间:2014-08-30 09:39:05

标签: d

这段伪代码效果很好:

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中的一个错误,但也许我错过了什么......?

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

1 个答案:

答案 0 :(得分:12)

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

使用以下代码可以看到:

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; });