map、each和collect有什么区别?

62
在Ruby中,eachmapcollect这三个方法在功能上有什么区别吗?
2个回答

117

eachmapcollect 不同,但 mapcollect 是相同的(从技术角度来说,mapcollect 的别名,但在我的经验中,map 被更频繁地使用)。

each 方法对 (Enumerable) 接收者中的每个元素执行封闭块:

[1,2,3,4].each {|n| puts n*2}
# Outputs:
# 2
# 4
# 6
# 8

mapcollect 会产生一个新的 Array,其中包含对接收者的每个元素应用块后得到的结果:

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

Array中也有map!/collect!方法;它们会就地修改数组:

a = [1,2,3,4]
a.map {|n| n*2} # => [2,4,6,8]
puts a.inspect  # prints: "[1,2,3,4]"
a.map! {|n| n+1}
puts a.inspect  # prints: "[2,3,4,5]"

2
map是社区选择的版本 https://github.com/bbatsov/ruby-style-guide#map-fine-select-reduce-size - Enrico Carlesso

24

Each会对块进行评估,但会丢弃Each块的评估结果并返回原始数组。

irb(main):> [1,2,3].each {|x| x*2}
=> [1, 2, 3]

Map/collect返回一个数组,该数组是调用块处理数组中每个项目后的结果。

irb(main):> [1,2,3].collect {|x| x*2}
=> [2, 4, 6]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接