কলব্যাক হিসাবে একটি রেফারেন্স নেবে এমন একটি জাস্ট অ্যাসিন এফএন কীভাবে ব্যবহার করবেন?


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পারেন))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.