Ruby iterators allow us to pull out every element in an array and perform some sort of action with that element. Iterators let you loop through an array and do something with every element inside.
each
Ruby’s built-in each
method can be called on an array. It accepts a block of code that tells it what to do with each element inside the array.
Important: The return value of each
is the original array that it was called on. It will not return the updated elements; instead, it will return the original array with no changes to the elements.
Example
numbers = [1, 2, 3, 4, 5]
numbers.each do |number|
number + 1
end
The above code will loop over each element in the numbers
array. In the first line of the each
setup, we’ve assigned each element in numbers
a value of number
— that’s the variable name that will represent each element in each
’s code block, which follows. We can use any value for that variable, but number
makes sense here because each element of numbers
is an integer.
The code block (number + 1
) will add 1
to each element (here represented with number
) of the numbers
array.
Note that each
requires an end
to close it up.
The return value of the code above? The original numbers
array: [1, 2, 3, 4, 5]
How can we return the updated elements using each
?
What if we want the return value of the code example above to be an array of the updated elements — an array where each element’s value has increased by 1
?
We’ll need to first define a variable that’s equal to an empty array. Then, on each loop of each
, we’ll add the element’s new value to that array. After the each
loop has completed, we’ll return the new array, which will now contain the new values for all of the elements.
numbers = [1, 2, 3, 4, 5]
updated_array = []
numbers.each do |number|
updated_array << number + 1
end
updated_array
The final return value of the code above will be [2, 3, 4, 5, 6]
— we used <<
inside of the each
code block to add each element plus 1
to updated_array
.
map
Just like each
, Ruby’s built-in map
method will loop over an array’s elements and execute a code block on each loop. The major difference?
Important: The return value of map
will be a new array with the updated elements. But the value of the original array that map
is called on will not change — map
is nondestructive.
Example
numbers = [1, 2, 3, 4, 5]
numbers.map do |number|
number + 1
end
The return value of the code above is [2, 3, 4, 5, 6]
— an array of the elements of numbers
with map
’s code block (number + 1
) applied to each.
But if we were to call numbers
to check the original array’s value, we’d see that it still returns [1, 2, 3, 4, 5]
— map
did not affect its value.
collect
So what about collect
? Easy! collect
and map
are synonyms in Ruby — they operate the same way and can be used interchangeably (though it may be helpful to only use one in a codebase just to keep things orderly and easy to read).