2015-09-25 64 views
3

在C++中,我可以創建兩個lambda,每個lambda通過值來捕獲在定義lambda時a的值。通過D語言的值捕獲Lambda

int main() 
{ 
    int a; 

    a = 4; 
    auto f1 = [=](int x) { return x * a; }; 

    a = 6; 
    auto f2 = [=](int x) { return x * a; }; 

    std::cout << "Answer 1 is " << f1(10) << "\n"; 
    std::cout << "Answer 2 is " << f2(10) << "\n"; 
} 

結果運行的是:

Answer 1 is 40 
Answer 2 is 60 

然而,在d我似乎能夠做到的是:

import std.stdio; 

void main() 
{ 
    int a; 

    a = 4; 
    auto f1 = (int x){ return x * a;}; 

    a = 6; 
    auto f2 = (int x){ return x * a;}; 

    writeln("Answer 1 is ", f1(10)); 
    writeln("Answer 2 is ", f2(10)); 
} 

它產生的輸出:

Answer 1 is 60 
Answer 2 is 60 

是否有任何方式/語法來捕捉值在D中的值類似於在C++中使用[=],我似乎無法在手冊中找到答案,所以如果有一種方法可以理解鏈接,以便我可以理解我錯過了什麼。

+1

我相信D沒有這樣的功能。 – sigod

+0

啊,那肯定會解釋爲什麼我找不到它。 – jcoder

回答

4

你可以「捕捉」如果你使用一個輔助函數的倍數值:

auto multiplier(int m) { 
    return (int x){ return x * m;}; 
} 

void main() 
{ 
    int a; 

    a = 4; 
    auto f1 = multiplier(a); 

    a = 6; 
    auto f2 = multiplier(a); 

    writeln("Answer 1 is ", f1(10)); 
    writeln("Answer 2 is ", f2(10)); 
} 
+2

你也可以定義助手內聯,如果你喜歡。我在JavaScript中使用這種技術以及D. –

+0

謝謝,這似乎與我想要的最接近。 – jcoder

1

你能做的就是引入一個新的變量:

在一個循環,這意味着:

for(int i; i<10;i++){ 
    auto index = i; 
    storeFunction((int x){ return index;}); 
} 
+0

傳遞給'storeFunction'的委託不會擁有它自己的'index'副本。所以它沒有做OP的想法。 – Tamas