each
执行一个急切的评估,同时map
执行一个懒惰的评估.这意味着在您应用时each
,会立即map
计算每个元素,而仅在您访问它们时计算其结果.
这也意味着它each
不适合无限流.
map
不是迭代,它是一个转换函数.(事实上,将地图应用于范围根本不会迭代它;"懒惰地进行评估"在其文档中意味着您仍然负责自己迭代结果.)
each
是一个变体,map
它自动进行迭代,同时在过程中进行转换.它也适用于opApply
迭代的风格,而map
不是.
http://dlang.org/phobos/std_algorithm_iteration.html#.each
http://dlang.org/phobos/std_algorithm_iteration.html#.map
each
当您准备好处理结果并可能将更改保存回原始范围时(each
可以保存更改,而map
只是返回更改),您将在一系列转换结束时执行此操作.map
是一个中间工具.
map
获取范围并将函数应用于范围中的每个元素,并返回包含结果的范围.该范围是懒惰评估的,因此您不会计算任何值,除非您对该范围执行其他操作,例如应用foreach
它.
each
热切地将函数应用于范围中的每个元素.所以each
就像一个单行foreach
.
// Do some pointless application of map.
// The map won't be run here.
auto range = iota(0, 10).map!(x => cast(float) x);
// Now write all of them to stdout.
// This will be evaluated.
range.each!writeln;
Run Code Online (Sandbox Code Playgroud)