Wie kann ich mit einem anderen Schritt als 1 über einen Bereich in Rust iterieren? Ich komme aus einem C ++ - Hintergrund, also würde ich gerne so etwas machen
for(auto i = 0; i <= n; i+=2) {
//...
}
In Rust muss ich die range
Funktion verwenden, und es scheint nicht, dass ein drittes Argument für einen benutzerdefinierten Schritt verfügbar ist. Wie kann ich das erreichen?
Es scheint mir, dass man, bis die
.step_by
Methode stabil ist, leicht erreichen kann, was man will mit einemIterator
(wasRange
eigentlich sowieso ist):Wenn mehrere Bereiche unterschiedlichen Typs iteriert werden müssen, kann der Code wie folgt generisch gestaltet werden:
Ich überlasse es Ihnen, die Prüfung der oberen Grenzen zu eliminieren, um eine Struktur mit offenem Ende zu erstellen, wenn eine Endlosschleife erforderlich ist ...
Der Vorteil dieses Ansatzes besteht darin, dass er mit
for
Zucker arbeitet und auch dann weiter funktioniert, wenn instabile Funktionen verwendet werden können. Im Gegensatz zum Ansatz ohne Zucker, bei dem die Standards verwendet werdenRange
, geht die Effizienz bei mehreren.next()
Anrufen nicht verloren . Nachteile sind, dass zum Einrichten des Iterators einige Codezeilen erforderlich sind. Dies lohnt sich möglicherweise nur für Code mit vielen Schleifen.quelle
U
zu Ihrer zweiten Option können Sie Typen verwenden, die das Hinzufügen mit einem anderen Typ unterstützen und dennoch einen ergebenT
. Zum Beispiel kommen Zeit und Dauer in den Sinn.Sie würden Ihren C ++ - Code schreiben:
... in Rust so:
Ich denke, die Rust-Version ist auch besser lesbar.
quelle
continue
zu erhalten und richtig zu funktionieren. Obwohl dies möglich ist, fördert dieses Design Fehler.Verwenden Sie die num Kiste mit range_step
quelle
Wenn Sie an etwas Vordefiniertem und Kleinem wie 2 vorbeikommen, möchten Sie möglicherweise den Iterator verwenden, um manuell zu treten. z.B:
Sie können dies sogar verwenden, um eine beliebige Menge zu erhöhen (obwohl dies definitiv länger und schwerer zu verdauen wird):
quelle