async fn
zwraca anonimowy typ, który implementuje Future
, więc jeśli chcemy użyć go jako wywołania zwrotnego, musimy przekonwertować wartość zwracaną na obiekt cechy.
Próbowałem napisać funkcję, aby to zrobić, ale miałem pewne problemy życiowe.
async fn
zwróci czas życia wszystkich parametrów, więc podpis wywołania zwrotnego również musi. Jak mogę dodać czas życia do wartości zwrotnej wywołania zwrotnego?
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
źródło
źródło
normalize_async_cb
wskaźnika funkcji?Odpowiedzi:
Rdza nie obsługuje polimorfizmu wyższego rodzaju, dlatego należy dodać parametr lifetime do
AsyncCb
typu:Dodatkowo możesz uniknąć
Box
, zwracającimpl
cechę:(W razie potrzeby dzwoniący może użyć
Box::new(normalize_async_cb(…))
jako typuAsyncCb
).źródło