gpt4 book ai didi

stream - 返回 Stream trait 对象的 Future

转载 作者:行者123 更新时间:2023-11-29 08:26:57 26 4
gpt4 key购买 nike

我正在使用 futures = "0.1.21" crate,我正在尝试编写一个函数来返回一个特征对象,该对象是“Future boolStream”。在实际程序中,我正在建立与服务器的连接,该服务器会定期传输其操作状态。

future

我已经能够像这样返回“boolFuture”特征对象:

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(); }

现在我想返回“boolStreamFuture”,但是如果我尝试:

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 来限制 future ,那么您为什么不将完全相同的逻辑应用于流?

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())
}

关于stream - 返回 Stream trait 对象的 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50824737/

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