原文
关于映射带模板参数
的函数,我惊讶
地发现它仍可同运行时确定
的函数,甚至是闭包
等工作.我想理解它背后的机制.
注释掉
的行会导致错误,即编译时
无法确定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;
}
感谢你的见解!
这很简单,如果参数
是运行时函数
,则按函数指针(或闭包)
对待它.
按运行时
绑定的闭包
对待该参数.实例化时,从调用者的环境
,插入填充码
以传递
闭包.