Antworten:
Die with_indexMethode verwendet einen optionalen Parameter, um den Startindex zu versetzen. each_with_indexmacht 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_indexwurde früher in Ruby eingeführt. with_indexwurde später eingeführt:
0.Heutzutage with_indexwäre die Verwendung unter dem Gesichtspunkt der Allgemeinheit und Lesbarkeit besser, aber unter dem Gesichtspunkt der Beschleunigung des Codes each_with_indexlä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_eachläuft schneller als reverse.each. Diese Methoden haben Grund zu existieren.
reverseBeispiel gibt das ein reverseanderes Array und keinen Enumerator zurück. Wenn es einen Enumerator zurückgegeben hat, sollte es mit einer guten Implementierung nicht langsamer sein.
with_indexeinen Startindex ermöglicht Offset,with_indexwird im allgemeinen bevorzugt , wenn in Verbindung mitmap,reduce,collectusw. Kurz gesagt,map.with_indexliest besser alseach_with_index.map. In gewisser Weise ist es bei Verwendung mitmapein Ersatz für die nicht existierendemap_with_indexMethode.