可能重复:
Ruby - What is the difference between map, each and collect?
我也看过Ruby-Doc,但我无法理解
之间的区别map
each
iterators。如果你能给出一个例子并解释一下会很棒。
答案 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”。请注意,each
和map
都不会修改原始集合。这是创建数组并在迭代循环中推送它的简洁,功能性替代方案。
答案 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]