difference between each.with_index and each_with_index in Ruby?
I'm really confused about the difference between each.with_index
and each_with_index
. They have different types but seem to be identical in practice.
The with_index
method takes an optional parameter to offset the starting index. each_with_index
does the same thing, but has no optional starting index.
For example:
[:foo, :bar, :baz].each.with_index(2) do |value, index|
puts "#{index}: #{value}"
end
[:foo, :bar, :baz].each_with_index do |value, index|
puts "#{index}: #{value}"
end
Outputs:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
was introduced into Ruby earlier. with_index
was introduced later:
- to allow wider usage with various enumerators.
- to allow index to start from a number other than
0
.
Today, using with_index
would be better from the point of view of generality and readability, but from the point of view of speeding up the code, each_with_index
runs slightly faster than each.with_index
.
When you feel that a single method can be easily expressed by straightforward chaining of a few methods, it is usually the case that the single method is faster than the chain. As for another example of this, reverse_each
runs faster than reverse.each
. These methods have reason to exist.