Как стереть тип будущего в новом API будущего? - PullRequest
0 голосов
/ 31 января 2019

Следующее не компилируется

#![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! in buz.

. В старые времена с Future<Item = (), Error = ()> вышеприведенное скомпилировалось бы без проблем, так каку нас нет ограничения Unpin, но у нас также нет await.

1 Ответ

0 голосов
/ 31 января 2019

Оберните Box в Pin:

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