Этот вопрос проверяет умение создавать пользовательские итераторы для эффективной работы с данными.
Пользовательские итераторы реализуют трейт Iterator с методом next. Они полезны для создания специфичных способов обхода данных и могут быть объединены с методами, такими как map и filter, для создания удобных конвейеров обработки.
Реализация пользовательского итератора:
Определите структуру и реализуйте трейт Iterator с методом next:
struct MyRange {
start: i32,
end: i32,
}
impl Iterator for MyRange {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
if self.start < self.end {
let val = self.start;
self.start += 1;
Some(val)
} else {
None
}
}
}
fn main() {
let range = MyRange { start: 1, end: 5 };
for num in range {
println!("{}", num);
}
}Конвейеры обработки данных:
Пользовательские итераторы можно комбинировать с методами:
fn main() {
let nums = vec![1, 2, 3, 4, 5];
let evens: Vec<_> = nums.into_iter()
.filter(|&x| x % 2 == 0)
.collect(); // Отфильтруем четные числа
println!("{:?}", evens);
}Преимущества:
Читабельность: Логика инкапсулируется в итератор.
Переиспользуемость: Итераторы легко комбинируются с другими операциями.
Эффективность: Ленивая обработка данных снижает накладные расходы.