Antworten:
Die with_index
Methode verwendet einen optionalen Parameter, um den Startindex zu versetzen. each_with_index
macht das gleiche, hat aber keinen optionalen Startindex.
Beispielsweise:
[: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
Ausgänge:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
wurde früher in Ruby eingeführt. with_index
wurde später eingeführt:
0
.Heutzutage with_index
wäre die Verwendung unter dem Gesichtspunkt der Allgemeinheit und Lesbarkeit besser, aber unter dem Gesichtspunkt der Beschleunigung des Codes each_with_index
läuft sie etwas schneller als each.with_index
.
Wenn Sie der Meinung sind, dass eine einzelne Methode leicht durch einfaches Verketten einiger weniger Methoden ausgedrückt werden kann, ist die einzelne Methode normalerweise schneller als die Kette. Wie für ein anderes Beispiel, reverse_each
läuft schneller als reverse.each
. Diese Methoden haben Grund zu existieren.
reverse
Beispiel gibt das ein reverse
anderes Array und keinen Enumerator zurück. Wenn es einen Enumerator zurückgegeben hat, sollte es mit einer guten Implementierung nicht langsamer sein.
with_index
einen Startindex ermöglicht Offset,with_index
wird im allgemeinen bevorzugt , wenn in Verbindung mitmap
,reduce
,collect
usw. Kurz gesagt,map.with_index
liest besser alseach_with_index.map
. In gewisser Weise ist es bei Verwendung mitmap
ein Ersatz für die nicht existierendemap_with_index
Methode.