这是我尝试的代码(用于流的fold()
用于实现len()
,但是我无法理解某些奇怪的类型错误(do(row: Row)
返回了{{1} }):
Result<(), Error>
谢谢!
答案 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()
}
}
答案 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上对其进行测试。