Я действительно смущен разницей между each.with_indexи each_with_index. Они имеют разные типы, но на практике кажутся идентичными.
Ответы:
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
each_with_indexбыл введен в Ruby ранее. with_indexбыл представлен позже:
0.Сегодня использование with_indexбыло бы лучше с точки зрения общности и удобочитаемости, но с точки зрения ускорения кода each_with_indexработает немного быстрее, чем each.with_index.
Когда вы чувствуете, что один метод может быть легко выражен путем прямого объединения нескольких методов, обычно бывает так, что один метод быстрее, чем цепочка. Что касается другого примера этого, reverse_eachработает быстрее, чем reverse.each. У этих методов есть основания для существования.
reverseпримере reverseвозвращается другой массив, а не перечислитель. Если он вернул перечислитель, то при хорошей реализации он не должен был быть медленнее.
with_indexпозволяет начальный индекс смещения,with_indexкак правило , предпочтительно при использовании в сочетании сmap,reduce,collectи т.д. Короче говоря,map.with_indexчитает лучшеeach_with_index.map. В некотором смысле, при использовании сmap, он заменяет несуществующийmap_with_indexметод.