"each","foreach","collect"和"map"之间有什么区别?

Add*_*son 3 ruby iteration enums iterator loops

似乎有很多方法可以在Ruby中循环使用Enumerable.有没有之间的差异each,foreachcollect,map或其他类似的方法呢?

或者有什么理由我不应该在某些情况下使用某些方法?

mio*_*rel 5

collect/ map是等价的.它们的区别each在于each只对每个元素执行块,而collect/ map返回一个数组,其中包含为每个元素调用块的结果.另一种可能的方式是,each期望对每个元素一些事情,而map期望转换每个元素(将其映射到其他元素).

您可以使用collectmap在任何地方each使用,您的代码仍然可以使用.但它的效率可能略低,因为它会在数组中收集结果,除非您的Ruby实现意识到它不必费心创建数组,因为它从未使用过.

另一个原因是使用each替代map或者collect是帮忙的人阅读你的代码.如果我看到each那么我就可以了,我们即将使用数据的每个元素来做某事.如果我看到map那么我期望看到基于旧数据的重新映射而创建新数据.

关于mapvs. collect我会说这是一个偏好的问题,但你应该选择一个并坚持它以保持一致性.