不能用`map`替换’each`的全部或大多数情况?
Enumerable#each
和Enumerable#map
之间的区别在于它是返回接收者还是映射结果。 回到接收器是微不足道的,你通常不需要像each{...}.another_method
之后继续一个方法链。另一个方法(我可能还没有看到这种情况。即使你想回到接收器,你可以用tap
来做到这一点)。 所以我认为使用Enumerable#each
所有或大多数情况都可以被Enumerable#map
替换。 我错了吗? 如果我是对的, each
的目的是什么? map
比each
慢吗?
编辑 :我知道当您对返回值不感兴趣时,通常会使用each
。 我对这种做法是否存在并不感兴趣,但我对这种做法是否有意义感兴趣,而不是从惯例的角度来看。
map
或each
之间的选择应由所需的最终结果决定:新数组还是没有新数组。 map
的结果可能是巨大的和/或愚蠢的:
p ("aaaa".."zzzz").map{|word| puts word} #huge and useless array of nil's
map
和each
之间的区别比一个返回一个新数组而另一个没有返回更重要。 重要的区别在于他们如何传达您的意图。
当你使用每个元素时,你的代码会说“我正在为每个元素做点什么。” 当您使用map
,您的代码会说“我正在通过转换每个元素来创建一个新数组。”
因此,虽然您可以使用map
代替each
map
,尽管有性能,但代码现在会对任何阅读它的人说谎。
我同意你说的话。 Enumerable#each
只返回它被调用的原始对象,而Enumerable#map
将迭代的当前元素设置为块的返回值,然后返回带有这些更改的新对象。
由于Enumerable#each
只返回原始对象本身,因此在需要简单地迭代或遍历元素的情况下,它可以优先于map
。
实际上, Enumerable#each
是一种简单而通用的传统迭代for循环方式,并且每个都比Ruby中的for循环更受欢迎。
当您组成这些enumaratiors时,您可以看到map
与each
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
还有另外一个例子,其中each
和map
之间的差异是function风格编写代码中的重要关键。