async fn
возвращает реализованный анонимный тип Future
, поэтому, если мы хотим использовать его в качестве обратного вызова, нам нужно преобразовать возвращаемое значение в объект-признак.
Я пытался написать функцию, чтобы сделать это, но у меня были некоторые проблемы на всю жизнь.
async fn
вернет время жизни всех параметров, так что подпись обратного вызова также должна. Как я могу добавить время жизни к возвращаемому значению обратного вызова?
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
источник
источник
normalize_async_cb
указателя функции?Ответы:
Rust не поддерживает полиморфизм с более высоким родом, поэтому вам нужно добавить параметр времени жизни к
AsyncCb
типу:Кроме того, вы можете избежать
Box
, вернувimpl
черту:(Вызывающий может затем использовать
Box::new(normalize_async_cb(…))
как типAsyncCb
при желании.)источник