5

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

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

4

4 回答 4

6

map和之间的区别each比一个返回一个新数组而另一个不返回更重要。重要的区别在于它们如何传达您的意图。

当您使用 时each,您的代码会显示“我正在为每个元素做一些事情”。当您使用 时map,您的代码会显示“我正在通过转换每个元素来创建一个新数组”。

因此,尽管您可以使用map, 来代替each性能,但代码现在会向任何阅读它的人撒谎。

于 2012-09-30T12:09:17.583 回答
5

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

p ("aaaa".."zzzz").map{|word| puts word} #huge and useless array of nil's
于 2012-09-30T10:15:05.880 回答
2

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

由于简单地返回原始对象本身,因此在您需要简单地迭代或遍历元素的情况下Enumerable#each,它可能是非常受欢迎的。map

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

于 2012-09-30T07:51:47.123 回答
0

map您可以看到编写这些枚举器之间以及编写这些枚举器时的显着差异each

例如,您需要获取带有索引的新数组:

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编写函数式代码的重要关键。

于 2012-09-30T13:10:51.950 回答