Le chiusure hanno alcuni dati nel loro stato, ma come posso renderlo mutabile? Ad esempio, voglio un contro-chiusura che restituisca il valore incrementato ogni volta, ma non funziona. Come posso farlo funzionare?Come si sposta lo stato mutabile in una chiusura?
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()]);
}
errore (e avvertimento) sto ottenendo:
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
})
mi aspettano che qualcosa di output come [1, 2, 3, 1, 2, 4]
.
Grazie! Ciò che mi confonde, è che il tratto "pub Fn: FnMut ". Non significa che 'Fn' (cosa ho usato) dovrebbe supportare il comportamento di' FnMut'? –
Shchvova
@Shchvova aggiornato. – Shepmaster