std.algorithm有两个迭代函数map
和each
。我无法理解有什么区别?
答案 0 :(得分:6)
each
执行热切评估,而map
执行懒惰评估。
这意味着,当您应用each
时,会立即计算每个元素,而map
仅在您访问它们时计算其结果。
这也意味着each
不适合无限流。
答案 1 :(得分:6)
map
不适用于迭代,它是一个转换函数。 (实际上,将地图应用于范围根本不会迭代它;"评估是懒散地进行的,并且#34;在其文档中意味着您仍然有责任自己迭代结果。)
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
是一个中间工具。
答案 2 :(得分:5)
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;