array.each和array.map有何不同?

时间:2011-04-16 19:50:48

标签: ruby iterator

  

可能重复:
  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"] 

4 个答案:

答案 0 :(得分:51)

side effects是相同的,这给你的逆向工程增加了一些困惑。

是的,两个迭代数组(实际上,任何mixes in Enumerable)但 map 将返回由块结果组成的数组,而每个只会返回原始数组。 每个的返回值很少在Ruby代码中使用,但 map most important functional tools之一。

顺便说一下,您可能很难找到文档,因为 map Enumerable 中的方法,而每个(需要一种方法)通过 Enumerable 模块)是 Array 中的方法。

作为一个琐事说明:地图实施基于每个

答案 1 :(得分:8)

来自API文档的

定义: each:为self中的每个元素调用一次,将该元素作为参数传递。 map:为self的每个元素调用一次block。创建一个包含块返回的值的新数组。

所以每个都是一个正常的循环,它遍历每个元素并调用给定的块

map通常用于您希望另一个数组通过某个逻辑映射到现有数组的位置。您还可以将方法作为参考传递给地图函数,如

[1,2,3].map(&:to_s)

答案 2 :(得分:2)

Array#map是阻止每个元素返回的任何内容的集合。

Array#每个执行每个元素的代码块,然后返回列表本身。

您应该查看Array#each vs. Array#map

答案 3 :(得分:2)

每个只是一个迭代器,它获取迭代的下一个元素并将其提供给块。 Map用于迭代,但将元素映射到其他东西,比如值乘以常量。在您的示例中,它们可以互换使用,但每个都是一个更通用的迭代器,它将元素传递给块。