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