如何将 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<Output = Query>)
在你的真实情况下是否有效?
【参考方案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 作为函数参数传递?的主要内容,如果未能解决你的问题,请参考以下文章