如何在 rust 迭代器中每 n 个项目散布一个值?

asd*_*159 1 iterator rust rust-itertools

我有一个字符迭代器,我想每 N 个字符添加一个换行符:

let iter = "abcdefghijklmnopqrstuvwxyz".chars();
let iter_with_newlines = todo!();
let string: String = iter_with_newlines.collect();
assert_eq("abcdefghij\nklmnopqrst\nuvwxyz", string);
Run Code Online (Sandbox Code Playgroud)

所以基本上,我想在迭代器中每 n 个字符散布一个换行符。我怎样才能做到这一点?

我的一些想法

如果我能做这样的事情那就太好了,哪里chunks有一种方法可以制作Iterator<T>Iterator<Iterator<T>iter.chunks(10).intersperse('\n').flatten()

如果我能做这样的事情那就太酷了:iter.chunks.intersperseEvery(10, '\n'),其中intersperseEvery是一种仅将值散布在每 n 个项目中的方法。

Jmb*_*Jmb 5

您可以使用enumerate和来完成此操作,而无需临时分配flat_map

use either::Either;

fn main() {
    let iter = "abcdefghijklmnopqrstuvwxyz".chars();
    let iter_with_newlines = iter
        .enumerate()
        .flat_map(|(i, c)| {
            if i % 10 == 0 {
                Either::Left(['\n', c].into_iter())
            } else {
                Either::Right(std::iter::once(c))
            }
        })
        .skip(1); // The above code add a newline in first position -> skip it
    let string: String = iter_with_newlines.collect();
    assert_eq!("abcdefghij\nklmnopqrst\nuvwxyz", string);
}
Run Code Online (Sandbox Code Playgroud)

操场