Возвращение будущего объекта-объекта Stream - PullRequest
0 голосов
/ 12 июня 2018

Я использую ящик futures = "0.1.21" и пытаюсь написать функцию, которая возвращает объект признака, который является "Future из Stream из bool s".В настоящей программе я устанавливаю соединение с сервером, который периодически передает статус своих операций.

Фьючерсы

Я смог вернуть "Future изbool "объект черты примерно так:

extern crate futures;
use futures::{future, Future};

fn future() -> Box<Future<Item = bool, Error = std::io::Error>> {
    Box::new(future::ok(true))
}

fn main() { future(); }

Теперь я хотел бы вернуть" Future из Stream из bool s ", но если я попытаюсь:

extern crate futures;
use futures::{future, stream, Future, Stream};

fn stream_future() -> Box<Future<Item = Stream<Item = bool, Error = std::io::Error>, Error = std::io::Error>> {
    Box::new(future::ok(stream::empty::<bool, std::io::Error>()))
}

fn main() { stream_future(); }

Не удается скомпилировать с:

error[E0271]: type mismatch resolving `<futures::FutureResult<futures::stream::Empty<bool, std::io::Error>, std::io::Error> as futures::Future>::Item == futures::Stream<Item=bool, Error=std::io::Error>`
 --> src/main.rs:5:5
  |
5 |     Box::new(future::ok(stream::empty::<bool, std::io::Error>()))
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `futures::stream::Empty`, found trait futures::Stream
  |
  = note: expected type `futures::stream::Empty<bool, std::io::Error>`
             found type `futures::Stream<Item=bool, Error=std::io::Error>`
  = note: required for the cast to the object type `futures::Future<Item=futures::Stream<Item=bool, Error=std::io::Error>, Error=std::io::Error>`

Итераторами

Я сталкиваюсь с подобной проблемой, если пытаюсь вернуть вложенный Iterator, например:

fn iter2() -> Box<Iterator<Item = Iterator<Item = bool>>> {
    Box::new(vec![vec![true].into_iter()].into_iter())
}

Сбой:

error[E0271]: type mismatch resolving `<std::vec::IntoIter<std::vec::IntoIter<bool>> as std::iter::Iterator>::Item == std::iter::Iterator<Item=bool>`
 --> src/main.rs:2:5
  |
2 |     Box::new(vec![vec![true].into_iter()].into_iter())
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::vec::IntoIter`, found trait std::iter::Iterator
  |
  = note: expected type `std::vec::IntoIter<bool>`
             found type `std::iter::Iterator<Item=bool>`
  = note: required for the cast to the object type `std::iter::Iterator<Item=std::iter::Iterator<Item=bool>>`

Другие варианты?

Я подозреваю, что либо невозможно «вложить» такие черты, либо я не смогчтобы понять синтаксис.

Если это невозможно, есть ли другой дизайн / шаблон, на который я должен обратить внимание, чтобы выполнить что-то подобное?

1 Ответ

0 голосов
/ 13 июня 2018

Ваш вопрос меня сильно смущает.Похоже, вы понимаете, что вам нужно 1 для определения будущего, так почему вы не применили точно такую ​​же логику к потоку?

type BoxedStream = Box<Stream<Item = bool, Error = io::Error>>;

fn stream_future() -> Box<Future<Item = BoxedStream, Error = io::Error>> {
    let s: BoxedStream = Box::new(stream::empty());
    Box::new(future::ok(s))
}

См.также:


1 Это на самом деле не всегда необходимо в современном Rust.В некоторых местах вы можете использовать impl Trait, чтобы вернуть значение, реализующее черту, не помещая ее в квадрат:

fn stream_future() -> impl Future<Item = impl Stream<Item = bool, Error = io::Error>, Error = io::Error> {
    future::ok(stream::empty())
}
...