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