如何删除新的Future API中的Future类型?

时间:2019-01-31 02:10:36

标签: async-await rust future

The following does not compile

#![feature(await_macro, async_await, futures_api)]
use core::future::Future;

async fn foo() {}

trait Bar {
    type Output: Future<Output = ()>;
    fn bar(&self) -> Self::Output;
}

impl Bar for () {
    type Output = Box<dyn Future<Output = ()>>;
    fn bar(&self) -> Self::Output {
        Box::new(foo())
    }
}

async fn buz() {
    await!(().bar())
}
error[E0277]: the trait bound `(dyn std::future::Future<Output=()> + 'static): std::marker::Unpin` is not satisfied
  --> src/lib.rs:19:15
   |
19 |     await!(().bar())
   |               ^^^ the trait `std::marker::Unpin` is not implemented for `(dyn std::future::Future<Output=()> + 'static)`
   |
   = note: required because of the requirements on the impl of `std::future::Future` for `std::boxed::Box<(dyn std::future::Future<Output=()> + 'static)>`

error[E0277]: the trait bound `dyn std::future::Future<Output=()>: std::marker::Unpin` is not satisfied
  --> src/lib.rs:19:5
   |
19 |     await!(().bar())
   |     ^^^^^^^^^^^^^^^^ the trait `std::marker::Unpin` is not implemented for `dyn std::future::Future<Output=()>`
   |
   = note: required because of the requirements on the impl of `std::future::Future` for `std::boxed::Box<dyn std::future::Future<Output=()>>`
   = note: required by `std::future::poll_with_tls_waker`
   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

如何设置类型Output?我希望bar通过调用Future返回一些foo,以便可以在await!中使用buz

在过去使用Future<Item = (), Error = ()>的情况下,由于我们没有Unpin约束,但也没有await,上面的代码可以毫无问题地编译。

1 个答案:

答案 0 :(得分:2)

Box包裹在Pin中:

impl Bar for () {
    type Output = Pin<Box<dyn Future<Output = ()>>>;
    fn bar(&self) -> Self::Output {
        Box::pin(foo())
    }
}