我希望有一个函数,其功能为async fn
的{{3}}。
f
中fn run
的类型应该是什么?
async fn foo() {}
fn run(f: /* ??? */) {}
async fn foo(args..) -> T
是fn(args..) -> impl Future<Output = T>
类型的函数。
但是,如果我写
fn run(f: fn() -> impl Future<()>)
我收到错误消息:
`impl Trait` not allowed outside of function and inherent method return types
答案 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
替换为Fn
或FnMut
。
答案 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();
}