ich lief in dieses Problem selbst - ist hier eine Abhilfe.
Sie können FromIterator
nicht verwenden, aber Sie können über den Inhalt eines Objekts fester Größe iterieren, oder, wenn die Dinge komplizierter sind, Indizes, die alles zerschneiden, auf das zugegriffen werden kann. In jedem Fall ist Mutation lebensfähig.
Zum Beispiel das Problem, das ich war der Typ mit einer Reihe hatte [[usize; 2]; 4]
:
fn main() {
// Some input that could come from another function and thus not be mutable
let pairs: [[usize; 2]; 4] = [[0, 0], [0, 1], [1, 1], [1, 0]];
// Copy mutable
let mut foo_pairs = pairs.clone();
for pair in foo_pairs.iter_mut() {
// Do some operation or other on the fixed-size contents of each
pair[0] += 1;
pair[1] -= 1;
}
// Go forth and foo the foo_pairs
}
Wenn dies in einer kleinen Funktion geschieht, es ist in Ordnung in meinem Buch. Wie auch immer, Sie würden am Ende einen transformierten Wert identischen Typs erhalten, also kopieren Sie das Ganze zuerst und dann mutieren Sie über den gleichen Aufwand wie das Referenzieren eines Werts in einem Abschluss und das Zurückgeben einer Funktion davon .
Beachten Sie, dass dies nur funktioniert, wenn Sie planen, etwas zu berechnen, das den gleichen Typ hat, bis einschließlich Größe/Länge. Aber das wird durch Ihre Verwendung von Rust-Arrays impliziert. (. Insbesondere könnten Sie Ihre Foo
s oder Nothing
sie Value()
, wie Sie möchten, und für Ihr Array innerhalb Typparameter sein noch)
Arrays implementieren Merkmale, zumindest kurze. Die Standardbibliothek enthält viele Implementierungen für kurze Arrays (bis zu 12 Elemente, denke ich). Das Problem besteht darin, dass Sie keine generische Implementierung für alle Arrays erstellen können und dass kein Array FromIterator implementiert. –