Какой тип асинхронного FN? - PullRequest
0 голосов
/ 18 января 2019

Я хочу иметь функцию, которая принимает указатель функции из async fn.
Каким должен быть тип f в fn run?

async fn foo() {}

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

В соответствии с асинхронным / ожидающим RFC :

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

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Использование параметра универсального типа может помочь, так как 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();
}
0 голосов
/ 18 января 2019

В сигнатуру функции необходимо ввести два параметра типа: один для 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 в зависимости от ваших потребностей.

...