@loyal
В Rust итераторы могут быть реализованы путем определения типа, который реализует трейт Iterator
. Для создания итератора в своей собственной структуре данных, вам необходимо:
1 2 3 |
pub struct MyStruct { data: Vec, } |
1 2 3 4 5 6 7 8 9 10 11 |
impl Iterator for MyStruct { type Item = i32; fn next(&mut self) -> Option { if let Some(item) = self.data.pop() { Some(item) } else { None } } } |
Эта реализация эмулирует обратный порядок элементов, возвращая элементы из вектора data
в обратном порядке с помощью pop()
. Когда вектор пуст, возвращается None
.
1 2 3 4 5 6 7 |
impl MyStruct { pub fn iter(&mut self) -> MyStruct { MyStruct { data: self.data.clone(), } } } |
В данном примере мы создаем копию вектора data
, чтобы сохранить исходные данные итератора.
Теперь вы можете использовать ваш итератор следующим образом:
1 2 3 4 5 |
let mut my_struct = MyStruct { data: vec![1, 2, 3, 4, 5] }; for item in my_struct.iter() { println!("{}", item); } |
В результате будет выведено:
1 2 3 4 5 |
5 4 3 2 1 |
Таким образом, реализуя трейт Iterator
, вы можете создавать итераторы для своих собственных структур данных и использовать их с помощью for
-цикла и других функциональных комбинаторов итераторов, предоставляемых стандартной библиотекой Rust.