Я действительно смущен различием между 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
. Эти методы имеют основания для существования.