Verschlüsse haben einige Daten in ihrem Zustand, aber wie mache ich es veränderbar? Zum Beispiel möchte ich einen Zähler schließen, der jedes Mal den inkrementierten Wert zurückgibt, aber es funktioniert nicht. Wie kann ich es funktionieren lassen?Wie verschiebe ich den veränderbaren Zustand in einen Abschluss?
fn counter() -> Box<Fn() -> i32> {
let mut c: i32 = 0;
Box::new(move || {
c += 1;
c
})
}
fn main() {
let mut a = counter();
let mut b = counter();
println!("{:?}", [a(), a(), a(), b(), b(), a()]);
}
Fehler (und Warnung) Ich erhalte:
error: cannot assign to captured outer variable in an `Fn` closure
c += 1;
^~~~~~
help: consider changing this closure to take self by mutable reference
Box::new(move || {
c += 1;
c
})
Ich erwarte, dass es zur Ausgabe etwas wie [1, 2, 3, 1, 2, 4]
.
Vielen Dank! Was mich verwirrt, ist das 'Pub Merkmal Fn: FnMut '. Bedeutet das nicht, dass "Fn" (was ich benutzt habe) das Verhalten von 'FnMut' unterstützen sollte? –
Shchvova
@Shchvova aktualisiert. – Shepmaster