async fn
mengembalikan tipe anonim yang mengimplementasikan Future
, jadi jika kita ingin menggunakannya sebagai panggilan balik, kita perlu mengonversi nilai kembali ke objek sifat.
Saya mencoba menulis fungsi untuk melakukan ini, tetapi saya memiliki beberapa masalah seumur hidup.
async fn
akan mengembalikan seumur hidup semua parameter, sehingga tanda tangan panggilan balik juga perlu. Bagaimana saya bisa menambahkan masa pakai ke nilai balik dari callback?
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
sumber
sumber
normalize_async_cb
pointer fungsi?Jawaban:
Karat tidak mendukung polimorfisme jenis yang lebih tinggi, jadi Anda perlu menambahkan parameter seumur hidup ke
AsyncCb
jenis:Secara tradisional, Anda dapat menghindari
Box
dengan mengembalikanimpl
sifat:(Penelepon kemudian dapat digunakan
Box::new(normalize_async_cb(…))
sebagai tipeAsyncCb
jika diinginkan.)sumber