这段伪代码效果很好:
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中的一个错误,但也许我错过了什么......?
(我的实际委托更复杂,我只是将代码简化为演示问题的最小示例。)
答案 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; })
;