IntoIterator

Трейт Iterator описує, як виконувати ітерацію після того, як ви створили ітератор. Пов’язаний з нею трейт IntoIterator визначає, як створити ітератор для типу. Він автоматично використовується циклом for.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 5 minutes.

Перейдіть до документації по IntoIterator. Кожна реалізація IntoIterator повинна декларувати два типи:

  • Item: тип для ітерації, наприклад, i8,
  • IntoIter: тип Iterator, що повертається методом into_iter.

Зауважте, що IntoIter і Item пов’язані: ітератор повинен мати той самий тип Item, що означає, що він повертає Option<Item>

У прикладі перебираються всі комбінації координат x та y.

Спробуйте виконати ітерацію над сіткою двічі в main. Чому це не спрацьовує? Зверніть увагу, що IntoIterator::into_iter отримує право власності на self.

Виправте цю проблему, реалізувавши IntoIterator для &Grid і зберігаючи посилання на Grid у GridIter.

Така сама проблема може виникнути для стандартних бібліотечних типів: for e in some_vector отримає право власності на some_vector і буде перебирати елементи з цього вектора, які йому належать. Натомість використовуйте for e in &some_vector для перебору посилань на елементи some_vector.