可能重复:
Array#each vs. Array#map
ruby-1.9.2-p180 :006 > ary = ["a", "b"]
=> ["a", "b"]
ruby-1.9.2-p180 :007 > ary.map { |val| p val }
"a"
"b"
=> ["a", "b"]
ruby-1.9.2-p180 :008 > ary.each { |val| p val }
"a"
"b"
=> ["a", "b"]
ruby-1.9.2-p180 :009 > ary.map { |val| val << "2" }
=> ["a2", "b2"]
ruby-1.9.2-p180 :010 > ary.each { |val| val << "2" }
=> ["a22", "b22"]
答案 0 :(得分:51)
side effects是相同的,这给你的逆向工程增加了一些困惑。
是的,两个迭代数组(实际上,任何mixes in Enumerable)但 map 将返回由块结果组成的数组,而每个只会返回原始数组。 每个的返回值很少在Ruby代码中使用,但 map 是most important functional tools之一。
顺便说一下,您可能很难找到文档,因为 map 是 Enumerable 中的方法,而每个(需要一种方法)通过 Enumerable 模块)是 Array 中的方法。作为一个琐事说明:地图实施基于每个。
答案 1 :(得分:8)
定义: each:为self中的每个元素调用一次,将该元素作为参数传递。 map:为self的每个元素调用一次block。创建一个包含块返回的值的新数组。
所以每个都是一个正常的循环,它遍历每个元素并调用给定的块
map通常用于您希望另一个数组通过某个逻辑映射到现有数组的位置。您还可以将方法作为参考传递给地图函数,如
[1,2,3].map(&:to_s)
答案 2 :(得分:2)
答案 3 :(得分:2)
每个只是一个迭代器,它获取迭代的下一个元素并将其提供给块。 Map用于迭代,但将元素映射到其他东西,比如值乘以常量。在您的示例中,它们可以互换使用,但每个都是一个更通用的迭代器,它将元素传递给块。