Разница между each.with_index и each_with_index в Ruby?

Я действительно смущен различием между each.with_index и each_with_index. У них разные типы, но на практике они кажутся одинаковыми.

Ответ 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. Эти методы имеют основания для существования.