2401d,d理解模板映射

原文
关于映射带模板参数的函数,我惊讶地发现它仍可同运行时确定函数,甚至是闭包等工作.我想理解它背后的机制.
注释掉的行会导致错误,即编译时无法确定choice(funcs),这是公平的,但它为何与上面两行的func不一样?我猜是因为函数在编译时是可见的字面,但闭包使这可疑.

import std.stdio;
import std.algorithm;
import std.random;
void main()
{
    int r = uniform(0,100);
    int delegate(int)[] funcs = [
        x => x * 2,
        x => x * x,
        x => 3,
        x => x * r        //闭包
    ];
    auto foo = [1,2,3,4,5];
    foreach(i; 0..10)
    {
        //很好:
        auto func = funcs.choice;
        writeln(foo.map!func);
        //但如下不行.
        //`writeln(foo.map!(funcs.choice));`
    }
}

事实上,下例中,编译时不可能知道函数,模板是如何实例化的?:

auto do_random_map(int delegate(int)[] funcs, int[] values)
{
    auto func = funcs.choice;
    return values.map!func;
}

感谢你的见解!

这很简单,如果参数运行时函数,则按函数指针(或闭包)对待它.

按运行时绑定的闭包对待该参数.实例化时,从调用者的环境,插入填充码传递闭包.

你可能感兴趣的:(dlang,d,d)