如何将 Future 作为函数参数传递?

Posted

技术标签:

【中文标题】如何将 Future 作为函数参数传递?【英文标题】:How to pass a Future as a function argument? 【发布时间】:2021-10-30 08:44:01 【问题描述】:

我习惯于 Scala 的 Future 类型,您可以将返回的任何对象包装在 Future[..] 中以指定它。

我的 Rust 函数 hello 返回 Query,我似乎无法将该结果作为类型为 Future<Output = Query> 的参数传递。为什么不,我应该如何更好地输入这个?

当我尝试将未来作为参数传递时发生失败:

use std::future::Future;

struct Person;
struct DatabaseError;

type Query = Result<Vec<Person>, DatabaseError>;

async fn hello_future(future: &dyn Future<Output = Query>) -> bool 
    future.await.is_ok()


async fn hello() -> Query 
    unimplemented!()


async fn example() 
    let f = hello();
    hello_future(&f);


fn main() 

编译失败并报错:

error[E0277]: `&dyn Future<Output = Result<Vec<Person>, DatabaseError>>` is not a future
 --> src/main.rs:9:5
  |
9 |     future.await.is_ok()
  |     ^^^^^^^^^^^^ `&dyn Future<Output = Result<Vec<Person>, DatabaseError>>` is not a future
  |
  = help: the trait `Future` is not implemented for `&dyn Future<Output = Result<Vec<Person>, DatabaseError>>`
  = note: required by `poll`

【问题讨论】:

请记住,我是通过本地主机连接的,所以即使我粘贴了每个字符,仍然缺少整个数据库。我只是返回虚拟数据,但是与tokio_postgres 的交互会丢失,因此我的帖子是这样的......这合理吗? 仍然缺少整个数据库 — 没错,但这是运行时要求。你有一个编译错误,甚至在尝试运行程序之前,更不用说连接到数据库了。 是的,所以我猜我们是不是把它当作一个骗子来关闭?答案是不可能?轮询会改变 Future,但由于它是不可变的,所以无法做到? 啊,是的,因为不需要运行 end2end 的编译错误 另一条路线:为什么要将future传递给函数,而不是只传递Query?你做的第一件事是.await它。即使你想通过未来,(future: impl Future&lt;Output = Query&gt;) 在你的真实情况下是否有效? 【参考方案1】:

async 函数 desugar 以返回实现 Future 特征的不透明值。这意味着您可以接受实现该特征的泛型类型。最简洁的语法是impl Trait,但你也可以引入一个命名的泛型参数:

async fn hello_future(future: impl Future<Output = Query>) -> bool 
    future.await.is_ok()


async fn example() 
    let f = hello();
    hello_future(f);

另见:

Is it possible to await a &dyn Future? What is the concrete type of a future returned from `async fn`? Why is `impl` needed when passing traits as function parameters? What does `impl` mean when used as the argument type or return type of a function? How to accept an async function as an argument?

【讨论】:

以上是关于如何将 Future 作为函数参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数作为参数传递,带参数? [复制]

如何将构造函数(可变参数)作为模板参数传递?

c++ - 如何将void函数作为参数传递?

如何将 QTableWidget 作为函数的参数传递

如何将 Rust 函数作为参数传递?

如何将成员函数作为参数传递?