collect和each之间有什么明显的区别?

12
使用数组,collect 和 each 之间的主要区别是什么?偏好吗?
some = []

some.collect do {|x| puts x}

some.each do |x|
    puts x
end

3
这是关于 Ruby 的,不是关于 RoR 的。你可以编辑标题。 - randomguy
重新标记以删除Rails标签,因为这是一个Ruby问题。 - Brad Cunningham
2个回答

36

array = [] 是定义一个数组对象的快捷方式(长形式为 array = Array.new)。

Array#collect(和Array#map)会根据在块中传递的代码返回一个新的数组。 Array#each 对数组的每个元素执行由块定义的操作。

我会这样使用 collect:

array = [1, 2, 3]
array2 = array.collect {|val| val + 1}

array.inspect # => "[1, 2, 3]"
array2.inspect # => "[2, 3, 4]"

而每个都像这样:

array = [1, 2, 3]
array.each {|val| puts val + 1 }
# >> 2
# >> 3
# >> 4
array.inspect # => "[1, 2, 3]"

希望这能有所帮助...


2
+1 为清晰简洁的解释。 - Brad Cunningham
我也感谢您提供如此好的解释。我在Codecademy的用户论坛上问了同样的问题,却得到了两个自以为是的家伙的轻蔑回复。他们好像认为这是世界上最愚蠢的问题,而我应该为提出这个问题感到羞耻。 - Kris Hunt

5

collect(或map)会将do块的返回值保存在一个新数组中并返回,例如:

some = [1,2,3,10]
some_plus_one = some.collect {|x| x + 1}
# some_plus_one == [2,3,4,11]

each 仅对每个项目执行 do 块,并不保存返回值。


非常感谢您的回复。因此,使用collect时,在遍历块的同时,它还将值保存到新数组中。因此,.collect有点像each,但返回每个块的返回值数组?那么collect和map是一样的吗?map已经过时了吗?有没有偏好? - RoR
3
mapcollect 是同一个方法,只是使用了不同的命名约定。 - ase

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