地图与各地之间的差异

时间:2012-03-06 15:45:22

标签: ruby map

  

可能重复:
  Ruby - What is the difference between map, each and collect?

我也看过Ruby-Doc,但我无法理解

之间的区别
map
each

iterators。如果你能给出一个例子并解释一下会很棒。

2 个答案:

答案 0 :(得分:72)

each只是迭代给定的枚举,为每个值运行块。它会丢弃块的返回值,并且每个都只返回它被调用的原始对象:

[1, 2, 3].each do |x|
  x + 1
end  # => [1, 2, 3]

这是执行传统迭代for循环的更好,更通用的方式,并且each 优先于Ruby中的for循环(事实上,我认为我从未在Ruby中使用过for循环。


然而,

map遍历每个元素,使用块的返回值在每个相应的索引处填充新数组并返回该新数组:

[1, 2, 3].map do |x|
  x + 1
end  # => [2, 3, 4]

因此,它使用给定的块将每个元素“映射”到一个新元素,因此名称为“map”。请注意,eachmap都不会修改原始集合。这是创建数组并在迭代循环中推送它的简洁,功能性替代方案。

答案 1 :(得分:7)

each返回原始对象。它用于使用数组的每个元素运行操作而不收集任何结果。例如,如果要打印数字列表,可以执行以下操作:

arr = [1, 2, 3, 4]
arr.each { |n| puts n }

现在,上面的puts方法实际返回nil。有些人不知道,但无论如何它并不重要;没有真正的理由收集该值(如果您想将arr转换为字符串,则应使用arr.map(&:to_s)arr.map { |n| n.to_s }


map返回传递给它的块的结果。这是对数组中的每个元素运行操作并检索结果的好方法。如果你想将数组的每个元素乘以2,这是自然的选择。作为奖励,您可以使用map!修改原始对象。例如:

arr = [1, 2, 3, 4]
arr.map! { |n| n * 2}
# => [2, 4, 6, 8]