如何为Futures :: Stream写len方法?

时间:2019-01-25 10:38:41

标签: stream rust

这是我尝试的代码(用于流的fold()用于实现len(),但是我无法理解某些奇怪的类型错误(do(row: Row)返回了{{1} }):

Result<(), Error>

谢谢!

2 个答案:

答案 0 :(得分:3)

fold上的默认Streams返回Future。如果您想阻止Stream并获取需要wait的元素数。

此外,如果Stream中的任何元素是错误的,都会惊慌。

可能的阻止实现:

use futures::stream::Stream;
use futures::future::{Future, ok};

trait StreamExt {
    fn len(self) -> usize;
}

impl<T: Stream> StreamExt for T {
    fn len(self) -> usize {
        self.fold(0, |a, _| ok(a + 1))
            .wait()
            .map_err(|_| ())
            .unwrap()
    }
}

Playground

答案 1 :(得分:0)

您可以使用for_each代替iter().count()

如果您坚持要为迭代器创建自己的计数逻辑,则可以按照以下步骤进行操作:

let count1 = vec![1, 2, 3, 4, 5, 6]
    .iter()
    .fold(0, |count, &_element| count + 1);

如果您选择使用for_each ,则需要设置外部变量 ,因为无法从for_each返回值。

您可以在此处为for_each实现计数逻辑,如下所示:

let mut count2 = 0u32;
vec![1, 2, 3, 4, 5, 6].iter().for_each(|_element| {
    count2 = count2 + 1;
});

您也可以在playground上对其进行测试。