async fn
renvoie un type anonyme qui implémente Future
, donc si nous voulons l'utiliser comme rappel, nous devons convertir la valeur de retour en objet trait.
J'ai essayé d'écrire une fonction pour ce faire, mais j'ai eu des problèmes à vie.
async fn
renverra la durée de vie de tous les paramètres, donc la signature du rappel doit également le faire. Comment puis-je ajouter la durée de vie à la valeur de retour du rappel?
use futures::future::{Future, FutureExt, LocalBoxFuture};
type Context = ();
type AsyncCb = Box<dyn for<'r> FnOnce(&'r Context) -> LocalBoxFuture<'r, ()>>;
fn normalize_async_cb<Fut: Future<Output = ()>>(f: for<'r> fn(&'r Context) -> Fut) -> AsyncCb
// how to add 'r for Fut? ^^^
{
let cb = move |ctx: &Context| f(ctx).boxed_local();
Box::new(cb)
}
rust
async-await
s97712
la source
la source
normalize_async_cb
un pointeur de fonction?Réponses:
Rust ne prend pas en charge le polymorphisme de type supérieur, vous devez donc ajouter un paramètre de durée de vie au
AsyncCb
type:De plus, vous pouvez éviter un
Box
en retournant unimpl
trait:(L'appelant peut ensuite utiliser
Box::new(normalize_async_cb(…))
comme typeAsyncCb
si vous le souhaitez.)la source