async fn
Gibt einen anonymen Typ zurück, der implementiert Future
wird. Wenn wir ihn also als Rückruf verwenden möchten, müssen wir den Rückgabewert in ein Merkmalobjekt konvertieren.
Ich habe versucht, eine Funktion zu schreiben, um dies zu tun, aber ich hatte einige lebenslange Probleme.
async fn
gibt die Lebensdauer aller Parameter zurück, daher muss auch die Signatur des Rückrufs. Wie kann ich die Lebensdauer zum Rückgabewert des Rückrufs hinzufügen?
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
quelle
quelle
normalize_async_cb
einen Funktionszeiger?Antworten:
Rust unterstützt keinen höherwertigen Polymorphismus, daher müssen Sie dem
AsyncCb
Typ einen Lebensdauerparameter hinzufügen :Zusätzlich können Sie ein vermeiden,
Box
indem Sie dasimpl
Merkmal zurückgeben:(Der Anrufer kann dann bei Bedarf
Box::new(normalize_async_cb(…))
als Typ verwendenAsyncCb
.)quelle