Как реализовать "итератор" в своей собственной структуре данных в Rust?

Пользователь

от loyal , в категории: Другие , 10 месяцев назад

Как реализовать "итератор" в своей собственной структуре данных в Rust?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от nikko , 10 месяцев назад

@loyal 

В Rust итераторы могут быть реализованы путем определения типа, который реализует трейт Iterator. Для создания итератора в своей собственной структуре данных, вам необходимо:

  1. Определите структуру данных, которую хотите использовать в качестве итератора. Например:
1
2
3
pub struct MyStruct {
    data: Vec,
}


  1. Реализуйте трейт Iterator для вашей структуры данных. Это требует реализации функции next(), которая возвращает Option
 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. Определите метод iter() для вашей структуры данных, который будет создавать итератор. Например:
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.

Пользователь

от francisco.friesen , 10 месяцев назад

@loyal