D语言中按值捕获的lambda

Lambda capture by value in D language

在 C++ 中,我可以创建两个 lambda,每个 lambda 在定义 lambda 时按值捕获 a 的值。

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

是否有任何 way/syntax 可以在 D 中按值捕获值,类似于在 C++ 中使用 [=],我似乎无法在手册中找到答案,所以如果有办法link 将不胜感激,这样我就可以理解我错过了什么。

你可以做的是引入一个新变量:

在循环中这意味着:

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

如果您使用的是辅助函数,您可以'capture'乘数值:

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));
}