Rust:“包装”迭代器

use*_*377 0 rust

有谁知道 Rust 是否提供某种包装迭代器?例如:

let data = vec!(1, 2, 3, 4, 5);
let mut it = data.into_iter();
let mut wrapped = some_wrapping_iter(it); // wrap it

wrapped.take(2).for_each(|e| process_first_2_elems(e));

it = wrapped.into(); // and get back the original
it.for_each(|e| process_remaining(e));
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 6

by_ref可以使用辅助方法来完成此任务。此方法强制借用迭代器而不是使用它,这是有效的,因为标准库中有一个全面的实现impl<I> Iterator for &mut I where I: Iterator。

let data = vec!(1, 2, 3, 4, 5);
let mut it = data.into_iter();

it.by_ref().take(2).for_each(|e| process_first_2_elems(e));
it.for_each(|e| process_remaining(e));
Run Code Online (Sandbox Code Playgroud)

您还可以通过自己获取独家参考来实现此目的(by_ref只会使其更符合人体工程学 - 在幕后它只是获取参考):

(&mut it).take(2).for_each(|e| process_first_2_elems(e));
Run Code Online (Sandbox Code Playgroud)