async fn
devuelve un tipo anónimo que se implementa Future
, por lo que si queremos usarlo como devolución de llamada, debemos convertir el valor de retorno en un objeto de rasgo.
Traté de escribir una función para hacer esto, pero tuve algunos problemas de por vida.
async fn
devolverá la vida útil de todos los parámetros, por lo que la firma de devolución de llamada también debe hacerlo. ¿Cómo puedo agregar la vida útil al valor de retorno de la devolución de llamada?
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
fuente
fuente
normalize_async_cb
un puntero de función?Respuestas:
Rust no admite polimorfismo de tipo superior, por lo que debe agregar un parámetro de por vida al
AsyncCb
tipo:Además, puede evitar un rasgo
Box
devolviendoimpl
:(La persona que llama puede usar
Box::new(normalize_async_cb(…))
como tipoAsyncCb
si lo desea).fuente