异步fn的类型是什么?

时间:2019-01-18 07:11:42

标签: types async-await rust future

我希望有一个函数,其功能为async fn的{​​{3}}。
ffn run的类型应该是什么?

async fn foo() {}

fn run(f: /* ??? */) {}

根据function pointer

  

async fn foo(args..) -> Tfn(args..) -> impl Future<Output = T>类型的函数。

但是,如果我写

fn run(f: fn() -> impl Future<()>)

我收到错误消息:

`impl Trait` not allowed outside of function and inherent method return types

2 个答案:

答案 0 :(得分:2)

您必须在函数签名中引入两个类型参数,一个用于Fn,一个用于Future,例如

#![feature(futures_api, async_await)]

async fn foo() {}

fn run<G: std::future::Future, F: FnOnce() -> G>(f: F) {
    f();
}

fn main() {
    bar(foo)
}

您可以根据需要将FnOnce替换为FnFnMut

答案 1 :(得分:1)

使用通用类型参数会有所帮助,因为async fn返回了Future特征的实现。

#![feature(futures_api, async_await)]

use std::future::Future;

fn main() {
    run(foo);
}

async fn foo() {}

fn run<T: Future>(f: fn() -> T) {
    f();
}