Passage d'une fermeture à deux reprises sans qu'il se déménagé
Question
Je suis en train d'expérimenter avec fermetures:
fn call_it(f: ||) {
f();
}
let klosure = || println("closure!");
call_it(klosure);
call_it(klosure); //Blows up here
En passant klosure en call_it() deux fois provoque une erreur de compilation sur le compte de la fermeture de la valeur déplacés:
closures.rs:16:13: 16:20 error: use of moved value: `klosure`
closures.rs:16 call_it(klosure);
^~~~~~~
closures.rs:15:13: 15:20 note: `closure` moved here because it has type `||`, which is a non-copyable stack closure (capture it in a new closure, e.g. `|x| f(x)`, to override)
closures.rs:15 call_it(klosure);
^~~~~~~
Le compilateur fait fait une suggestion sur la façon de résoudre le problème, mais je n'ai pas trouvé un moyen pour réussir à l'appliquer.
Toutes les suggestions?:D
La solution
note:`fermeture` déplacé ici car elle est de type `||`, ce qui est un non-copiable pile de fermeture (le capturer dans une nouvelle fermeture, par ex.`|x| f(x)", remplacer)
Cela signifie que vous devez écrire || closure()
au lieu de closure
:vous êtes de passage à une nouvelle fermeture des appels de votre première fermeture.
Autres conseils
(Mise à jour:Ne le faites pas, il pourrait être rejetée dans un avenir proche.Un &mut ||
sera probablement très bien maintenant et dans l'avenir.Voir la discussion et les liens dans les commentaires sur cette réponse.)
Une autre approche possible (bien qu'un peu plus laide à lire):
fn call_it(f_ref: &||) { // now takes a borrowed reference to a closure
(*f_ref)();
}
let klosure = || println("closure!");
call_it(&klosure);
call_it(&klosure);