D:地图和每个地图有什么区别?

时间:2015-03-31 15:32:51

标签: iteration d

std.algorithm有两个迭代函数mapeach。我无法理解有什么区别?

3 个答案:

答案 0 :(得分:6)

each执行热切评估,而map执行懒惰评估。 这意味着,当您应用each时,会立即计算每个元素,而map仅在您访问它们时计算其结果。

这也意味着each不适合无限流。

答案 1 :(得分:6)

map不适用于迭代,它是一个转换函数。 (实际上,将地图应用于范围根本不会迭代它;"评估是懒散地进行的,并且#34;在其文档中意味着您仍然有责任自己迭代结果。)

eachmap的一种变体,它会在转换过程中自动执行迭代。它也适用于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;