Я действительно смущен различием между each.with_index и each_with_index. У них разные типы, но на практике они кажутся одинаковыми.
Разница между each.with_index и each_with_index в Ruby?
Ответ 1
Метод with_index принимает необязательный параметр для смещения начального индекса. each_with_index делает то же самое, но не имеет необязательного начального индекса.
Например:
[: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
Выходы:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
		Ответ 2
 each_with_index был ранее введен в Ruby. with_index был введен позже:
- чтобы обеспечить более широкое использование с различными счетчиками.
 -  чтобы индекс начинался с числа, отличного от 
0. 
Сегодня использование with_index было бы лучше с точки зрения общности и удобочитаемости, но с точки зрения ускорения кода each_with_index работает немного быстрее, чем each.with_index.
Когда вы чувствуете, что один метод может быть легко выражен путем простой цепочки нескольких методов, обычно бывает, что единственный метод быстрее, чем цепочка. Что касается другого примера этого, reverse_each работает быстрее, чем reverse.each. Эти методы имеют основания для существования.