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

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top