gpt4 book ai didi

rust - 如何等待一个盒装 future 的结果?

转载 作者:行者123 更新时间:2023-12-01 05:07:48 25 4
gpt4 key购买 nike

use futures::{future, Future};

fn test() -> Box<dyn Future<Output = bool>> {
Box::new(future::ok::<bool>(true))
}

async fn async_fn() -> bool {
let result: bool = test().await;
return result;
}

fn main(){
async_fn();
println!("Hello!");
}
Playground
错误:
error[E0277]: the trait bound `dyn core::future::future::Future<Output = bool>: std::marker::Unpin` is not satisfied
--> src/main.rs:8:24
|
8 | let result: bool = test().await;
| ^^^^^^^^^^^^ the trait `std::marker::Unpin` is not implemented for `dyn core::future::future::Future<Output = bool>`
|
= note: required because of the requirements on the impl of `core::future::future::Future` for `std::boxed::Box<dyn core::future::future::Future<Output = bool>>`

最佳答案

根据 the implementation :

impl<F> Future for Box<F>
where
F: Unpin + Future + ?Sized,
盒装 future 只执行 Future trait 当 future 里面 Box工具 Unpin .
由于您的函数不保证返回的 future 实现 Unpin ,您的返回值将被视为未实现 Future .您将无法 await因为你的类型基本上不是 Future .
@Stargateur 的解决方案,向签名添加显式类型边界,有效( Playground ):
fn test() -> Box<dyn Future<Output = Result<bool, ()>> + Unpin> 
如果你使用的是 futures-rs,有一个辅助类型 BoxFuture .您可以使用 BoxedFuture没有明确说明 Unpin :
use futures::future::BoxFuture;

fn test() -> BoxFuture<'static, Result<bool, ()>> {
Box::pin(async { Ok(true) })
}
Playground

关于rust - 如何等待一个盒装 future 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60561573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com