2010-12-03 33 views
10

有人可以解釋下面的代碼嗎?當我嘗試瞭解isNumeric!T在這種情況下如何工作時,我感到困惑。D編程模板

auto foo(T)(T n) if (isNumeric!T) { 
    return (T m) {return m > n;}; 
} 

void main() { 
    auto hoo5 = foo!int(1000); 
    writeln(hoo5(93)); 
    writeln(hoo5(23)); 
} 

回答

13

開始:

auto foo(T)(T n) if (isNumeric!T) { 
    // ignore this for now 
} 

foo是一個通用的函數,它接受它的泛型類型的一個參數。 if (isNumeric!T)std.traits的編譯時檢查,保證foo的類型是數字。非數字類型不起作用。它的返回類型是推斷的,在這種情況下是一個委託。

此:

(T m) {return m > n;}; //returned from foo 

delegate literalor closure)。它基本上是一個帶狀態的函數指針。在這種情況下,它通過傳遞給foo的參數n關閉。在您的例子:

auto hoo5 = foo!int(1000); 

被有效地轉化爲函數:

bool hoo5 (int x) { return x > 1000; } 

所以,當你調用hoo5,它返回一個布爾值,表示如果參數大於1000 - 但只有在特定情況下, 。

如果你調用foo這樣的:

auto hoo5 = foo!double(1.2345); 

你得到一個返回boolean值,指示其參數(雙)比1.2345更大的函數的引用。

+0

有錯別字。我修復了它。謝謝! – Nate 2010-12-03 19:25:19