2014-08-30 33 views
8

的僞這段代碼只是正常: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中的錯誤,但也許我錯過了什麼......?

(我的實際委託更加複雜,我只是將代碼縮減爲演示問題的最小示例)。

回答

12

使用(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; });