async fn
retorna um tipo anônimo que implementa Future
; portanto, se quisermos usá-lo como um retorno de chamada, precisamos converter o valor de retorno em um objeto de característica.
Tentei escrever uma função para fazer isso, mas tive alguns problemas durante a vida.
async fn
retornará a vida útil de todos os parâmetros, portanto, a assinatura do retorno de chamada também precisará. Como posso adicionar a vida útil ao valor de retorno do retorno de chamada?
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
fonte
fonte
normalize_async_cb
um ponteiro de função?Respostas:
O Rust não suporta polimorfismo de tipo superior, portanto, você precisa adicionar um parâmetro vitalício ao
AsyncCb
tipo:Além disso, você pode evitar um
Box
retornando umaimpl
característica:(O chamador pode usar
Box::new(normalize_async_cb(…))
como tipo,AsyncCb
se desejar.)fonte