不能用`map`替换’each`的全部或大多数情况?

Enumerable#eachEnumerable#map之间的区别在于它是返回接收者还是映射结果。 回到接收器是微不足道的,你通常不需要像each{...}.another_method之后继续一个方法链。另一个方法(我可能还没有看到这种情况。即使你想回到接收器,你可以用tap来做到这一点)。 所以我认为使用Enumerable#each所有或大多数情况都可以被Enumerable#map替换。 我错了吗? 如果我是对的, each的目的是什么? mapeach慢吗?

编辑 :我知道当您对返回值不感兴趣时​​,通常会使用each 。 我对这种做法是否存在并不感兴趣,但我对这种做法是否有意义感兴趣,而不是从惯例的角度来看。

mapeach之间的选择应由所需的最终结果决定:新数组还是没有新数组。 map的结果可能是巨大的和/或愚蠢的:

 p ("aaaa".."zzzz").map{|word| puts word} #huge and useless array of nil's 

mapeach之间的区别比一个返回一个新数组而另一个没有返回更重要。 重要的区别在于他们如何传达您的意图。

当你使用每个元素时,你的代码会说“我正在为每个元素做点什么。” 当您使用map ,您的代码会说“我正在通过转换每个元素来创建一个新数组。”

因此,虽然您可以使用map代替each map ,尽管有性能,但代码现在会对任何阅读它的人说谎。

我同意你说的话。 Enumerable#each只返回它被调用的原始对象,而Enumerable#map将迭代的当前元素设置为块的返回值,然后返回带有这些更改的新对象。

由于Enumerable#each只返回原始对象本身,因此在需要简单地迭代或遍历元素的情况下,它可以优先于map

实际上, Enumerable#each是一种简单而通用的传统迭代for循环方式,并且每个都比Ruby中的for循环更受欢迎。

当您组成这些enumaratiors时,您可以看到mapeach map之间的显着差异。

例如,你需要获得带有indixes的新数组:

 array.each.with_index.map { |index, element| [index, element] } 

或者,例如,您只需要将一些方法应用于数组中的所有元素并打印结果,而无需更改原始数组:

 m = 2.method(:+) [1,2,3].each { |a| puts m.call(a) } #=> prints 3, 4, 5 

还有另外一个例子,其中eachmap之间的差异是function风格编写代码中的重要关键。