【发布时间】: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>)在你的真实情况下是否有效?
标签: rust future rust-tokio tokio-postgres