एक कॉल के रूप में एक संदर्भ लेता है कि एक रस्ट async fn का उपयोग कैसे करें?


10

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)
}

normalize_async_cbफ़ंक्शन पॉइंटर का इनपुट क्यों है ?
कोडर -256

इसके अलावा, "कॉलबैक" से आपका क्या मतलब है? क्या आप एक उदाहरण प्रदान कर सकते हैं जिसमें आपको इस प्रकार के कॉलबैक की आवश्यकता होगी?
कोडर -256

जवाबों:


1

जंग उच्च किस्म के बहुरूपता का समर्थन नहीं करता है, इसलिए आपको AsyncCbटाइप करने के लिए एक जीवनकाल पैरामीटर जोड़ना होगा :

use futures::future::{Future, FutureExt, LocalBoxFuture};

type Context = ();
type AsyncCb<'r> = Box<dyn FnOnce(&'r Context) -> LocalBoxFuture<'r, ()> + 'r>;

fn normalize_async_cb<'r, Fut: Future<Output = ()> + 'r>(f: fn(&'r Context) -> Fut) -> AsyncCb {
    let cb = move |ctx: &'r Context| f(ctx).boxed_local();
    Box::new(cb)
}

आदर्श रूप से, आप Boxवापसी के implनिशान से बच सकते हैं :

fn normalize_async_cb<'r, Fut: Future<Output = ()> + 'r>(
    f: fn(&'r Context) -> Fut,
) -> impl FnOnce(&'r Context) -> LocalBoxFuture<'r, ()> {
    let cb = move |ctx: &'r Context| f(ctx).boxed_local();
    cb
}

(कॉल करने वाला फिर चाहें तो Box::new(normalize_async_cb(…))टाइप का उपयोग कर सकता है AsyncCb।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.