可能是重复问题:
Ruby - map,each和collect之间有什么区别?
我也查看了Ruby-Doc,但我无法理解它们之间的区别。
map
each
迭代器。如果您能举例并解释一下,那将非常好。
可能是重复问题:
Ruby - map,each和collect之间有什么区别?
我也查看了Ruby-Doc,但我无法理解它们之间的区别。
map
each
迭代器。如果您能举例并解释一下,那将非常好。
each
简单地遍历给定的可枚举对象,对每个值运行块。它会丢弃块的返回值,并简单地返回调用它的原始对象:
[1, 2, 3].each do |x|
x + 1
end # => [1, 2, 3]
for
循环,而在 Ruby 中,each
要比 for
循环更受欢迎(实际上,我想我从未在 Ruby 中使用过 for
循环)。
map
函数会遍历每个元素,使用块的返回值在每个对应的索引处填充一个新数组,并返回该新数组:
[1, 2, 3].map do |x|
x + 1
end # => [2, 3, 4]
each
和map
本身都不会修改原始集合。这是在迭代循环中创建数组并将其推入其中的简洁的函数式替代方法。Array#map!
(带有bang)的一个好的解释。另一方面,map
(包括Enumerable#map
和Array#map
)都会返回一个新数组(无论给定接收器如何),其中包含通过块返回的值,而不会更改接收器。 - Stefaneach
返回原始对象。它用于在不收集任何结果的情况下使用数组的每个元素运行操作。例如,如果您想打印一个数字列表,可以这样做:
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]
map
和collect
是等价的。虽然我从来没有喜欢过"collect"这个名字,因为我认为它并不能很好地描述它的功能。 - Andrew Marshall