首页 > 解决方案 > 如何接受异步函数作为参数?

问题描述

我想复制将闭包/函数作为参数的行为和人体工程学,就像map这样:iterator.map(|x| ...).

我注意到一些库代码允许传入异步功能,但是这种方法不允许我传入参数:

pub fn spawn<F, T>(future: F) -> JoinHandle<T>
where
    F: Future<Output = T> + Send + 'static,
    T: Send + 'static,
spawn(async { foo().await });

我希望做以下事情之一:

iterator.map(async |x| {...});
async fn a(x: _) {}
iterator.map(a)

标签: asynchronousrustasync-awaitclosuresfuture

解决方案


async函数被有效地脱糖为返回impl Future。一旦你知道了,就可以结合现有的 Rust 技术来接受一个函数/闭包,从而产生一个具有两种泛型类型的函数:

use std::future::Future;

async fn example<F, Fut>(f: F)
where
    F: FnOnce(i32, i32) -> Fut,
    Fut: Future<Output = bool>,
{
    f(1, 2).await;
}

这也可以写成

use std::future::Future;

async fn example<Fut>(f: impl FnOnce(i32, i32) -> Fut)
where
    Fut: Future<Output = bool>,
{
    f(1, 2).await;
}

推荐阅读