Мене дуже бентежить різниця між 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методу.