async fndevuelve 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 fndevolverá 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_cbun puntero de función?Respuestas:
Rust no admite polimorfismo de tipo superior, por lo que debe agregar un parámetro de por vida al
AsyncCbtipo:Además, puede evitar un rasgo
Boxdevolviendoimpl:(La persona que llama puede usar
Box::new(normalize_async_cb(…))como tipoAsyncCbsi lo desea).fuente