2015-09-25 53 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