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

时间:2012-09-30 07:24:20

标签: ruby map each

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

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

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

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

事实上,Enumerable#each是一种简单而通用的传统迭代for循环方式,并且每个方法都优于Ruby中的for循环。

答案 3 :(得分:0)

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

例如,您需要在其中添加带有indix的新数组:

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之间的差异是函数式编写代码中的重要关键。