【问题标题】:Difference Between map and each [duplicate]地图和每个[重复]之间的区别
【发布时间】:2012-03-24 03:00:52
【问题描述】:

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

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

map
each

迭代器。如果你能举个例子解释一下就好了。

【问题讨论】:

  • ...除了 Andrew 和 Bryan 的回答之外,我还补充说,还有另一种称为 collect 的方法与 map 完全相同;)
  • 是的,map & collect 是等价的。虽然我从不喜欢“收集”这个名字,因为我认为它不能很好地描述它的功能。

标签: ruby map


【解决方案1】:

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

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

这只是进行传统迭代 for 循环的一种更好、更通用的方法,在 Ruby 中,eachfor 循环更受欢迎(事实上,我不这样做)我想我曾经在 Ruby 中使用过 for 循环)。


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

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

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

【讨论】:

  • 值得强调的是,它没有在 original 集合中设置任何值;仅在其返回的副本中。
  • “将被迭代的当前元素设置为返回值” 听起来好像当前元素正在被块的值替换。而“with those changes” 强调某事正在发生变化。这将是对Array#map! 的一个很好的解释(砰的一声)。另一方面,mapEnumerable#mapArray#map)返回一个新数组(它始终是一个数组,与给定的接收者无关),其中包含块返回的值而不更改接收者。
  • @Stefan 我可以看到混乱,希望更新能澄清一些事情(这是很久前写的!)。
【解决方案2】:

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]

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 2014-08-16
    • 2011-04-08
    • 2012-11-24
    • 2013-06-05
    • 2021-09-29
    • 2020-05-27
    • 2016-03-23
    • 2012-08-11
    相关资源
    最近更新 更多