tags:

views:

115

answers:

2

Using arrays what's the main difference between collect and each? Preference?

some = []

some.collect do {|x| puts x}

some.each do |x| puts x end

+1  A: 

collect (or map) will "save" the return values of the do block in a new array and return it, example:

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

each will only execute the do block for each item and wont save the return value.

adamse
Thank you very much for your response. So basically with collect, at the same time going through the block it's also saving the values into a new array. So a .collect is somewhat like of an each but with returning an array with return values from each of the blocks? So collect and map are the same thing? Is map deprecated or anything? Any preference one over the other?
RoR
`map` and `collect` are the same thing (the same method), it's just different naming conventions.
adamse
+3  A: 

array = [] is a shortcut to define an array object (long form: array = Array.new)

Array#collect (and Array#map) return a new array based on the code passed in the block. Array#each performs an operation (defined by the block) on each element of the array.

I would use collect like this:

irb(main):001:0> array = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> array2 = array.collect {|val| val + 1}
=> [2, 3, 4]
irb(main):005:0> array.inspect
=> "[1, 2, 3]"
irb(main):006:0> array2.inspect
=> "[2, 3, 4]"

And each like this:

irb(main):007:0> array = [1, 2, 3]
=> [1, 2, 3]
irb(main):008:0> array.each {|val| puts val + 1 }
2
3
4
=> [1, 2, 3]
irb(main):009:0> array.inspect
=> "[1, 2, 3]"

Hope this helps...

Brian
+1 for a clear and succinct explanation
Foovanadil
Thank you very much for the example.
RoR