地图与各地之间的差异

25 ruby map

可能重复:
Ruby - map,each和collect之间有什么区别?

我也看过Ruby-Doc,但我无法理解它们之间的区别

map
each
Run Code Online (Sandbox Code Playgroud)

迭代器.如果你能给出一个例子并解释它会很棒.

And*_*all 73

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

[1, 2, 3].each do |x|
  x + 1
end  # => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

这是简单地做一个传统的迭代的一个更好的,更普遍的方式for循环,each很多优于forRuby中环(其实,我不认为我曾经使用过for的红宝石环路).


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

[1, 2, 3].map do |x|
  x + 1
end  # => [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

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

  • 值得强调的是,它没有在*original*集合中设置任何值; 只在它的返回副本中. (4认同)

bry*_*mck 7

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

arr = [1, 2, 3, 4]
arr.each { |n| puts n }
Run Code Online (Sandbox Code Playgroud)

现在,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]
Run Code Online (Sandbox Code Playgroud)