Kann ich den Offset des Index im Schleifeniterator each_with_index definieren? Mein direkter Versuch schlug fehl:
some_array.each_with_index{|item, index = 1| some_func(item, index) }
Bearbeiten:
Erläuterung: Ich möchte keinen Array-Offset. Ich möchte, dass der Index im each_with_index nicht bei 0 beginnt, sondern bei 1.
Antworten:
Tatsächlich
Enumerator#with_index
erhält Offset als optionalen Parameter:Ausgänge:
Übrigens denke ich, dass es nur in 1.9.2 da ist.
quelle
with_index
keine params, Indizes von0
Das Folgende ist kurz und bündig mit Rubys Enumerator-Klasse.
Ausgabe
Array # gibt jeweils einen Enumerator zurück, und der Aufruf von Enumerator # with_index gibt einen anderen Enumerator zurück, an den ein Block übergeben wird.
quelle
1) Am einfachsten ist es,
index+1
anstelleindex
der Funktion Folgendes zu ersetzen :aber wahrscheinlich ist das nicht was du willst.
2) Als Nächstes können Sie einen anderen Index
j
innerhalb des Blocks definieren und anstelle des ursprünglichen Index verwenden:3) Wenn Sie den Index häufig auf diese Weise verwenden möchten, definieren Sie eine andere Methode:
Aktualisieren
Diese Antwort, die vor einigen Jahren beantwortet wurde, ist jetzt veraltet. Für moderne Rubine funktioniert die Antwort von Zack Xu besser.
quelle
+1
in meinem Code auf+2
oder+10
. Es funktioniert auch.Wenn dies
some_index
irgendwie sinnvoll ist, sollten Sie einen Hash anstelle eines Arrays verwenden.quelle
Ich bin darauf gestoßen.
Meine nicht notwendige Lösung ist die beste, aber sie hat nur bei mir funktioniert.
In der Ansichtsiteration:
füge einfach hinzu: index + 1
Das ist alles für mich, da ich keinen Verweis auf diese Indexnummern verwende, sondern nur zum Anzeigen in einer Liste.
quelle
Ja, du kannst
UPD
Außerdem sollte ich beachten, dass ein Offset, der größer als Ihre Array-Größe ist, einen Fehler verursacht. Weil:
Was können wir hier tun:
Oder um Offset zu vorherrschen:
Das ist ein bisschen hacky
UPD 2
Soweit Sie Ihre Frage aktualisiert haben und jetzt keinen Array-Offset, sondern einen Index-Offset benötigen, funktioniert die @ sawa-Lösung für Sie einwandfrei
quelle
Ariel hat recht. Dies ist der beste Weg, um damit umzugehen, und es ist nicht so schlimm
Das ist völlig akzeptabel und besser als die meisten Lösungen, die ich dafür gesehen habe. Ich dachte immer, das ist es, wofür #inject ist ... na ja.
quelle
Ein anderer Ansatz ist zu verwenden
map
quelle
Dies funktioniert in jeder Ruby-Version:
Und für ein generisches Array:
quelle
quelle