Jestem naprawdę zdezorientowany różnicą między each.with_indexa each_with_index. Mają różne typy, ale w praktyce wydają się identyczne.
Odpowiedzi:
with_indexMetoda pobiera opcjonalny parametr, aby zrównoważyć indeks początkowy. each_with_indexrobi to samo, ale nie ma opcjonalnego indeksu początkowego.
Na przykład:
[: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
Wyjścia:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_indexzostał wprowadzony do Rubiego wcześniej. with_indexzostał wprowadzony później:
0.Dziś użycie with_indexbyłoby lepsze z punktu widzenia ogólności i czytelności, ale z punktu widzenia przyspieszenia kodu,each_with_index przebiega nieco szybciej niż each.with_index.
Kiedy czujesz, że pojedynczą metodę można łatwo wyrazić za pomocą prostego łączenia kilku metod w łańcuch, zwykle jest tak, że pojedyncza metoda jest szybsza niż łańcuch. Jeśli chodzi o inny przykład, reverse_eachdziała szybciej niż reverse.each. Te metody mają powód do istnienia.
reverseprzykładzie reversezwraca inną tablicę, a nie moduł wyliczający. Jeśli zwrócił moduł wyliczający, nie powinien być wolniejszy z dobrą implementacją.
with_indexpozwala indeks początkowy offsetowej,with_indexna ogół korzystne, gdy używany w połączeniu zmap,reduce,collect, itd. Krótko mówiąc,map.with_indexbrzmi lepiej niżeach_with_index.map. W pewnym sensie, gdy jest używany zmap, jest zastępstwem dla nieistniejącejmap_with_indexmetody.