콜백으로 참조가 필요한 Rust 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을 반환 하여 a 를 피할 수 있습니다 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.