Комментарии 2
Цикл for используется для итераций.
Итерация - это однократное исполнение тела цикла. Правильнее: Цикл for используется для итерирования (элементов контейнера).
который "пожирал" твою коллекция
Моя твоя не понимать.
Так что знак амперсанда - это итератор.
Знак амперсанда не имеет никакого отношения к трейтам итераторов. for x in y {…}
рассахаривается в код, использющий IntoIterator::into_iter(y)
и всё, что делает амперсанд — это для y: T
превращает тип T
в &T
(т.е. в ссылку на T), что приводит к использованию другой реализации трейта IntoIterator
. Для стандартных коллекций раньше были специальные исключения.
Вдаваясь в подробности реализации Rust-конструкции цикла for, следует отметить что она расширяется компилятором в вызов метода.
В таблице кратких форм и их эквивалентов ниже, никакой эквивалентности нет. Я вполне могу сделать коллекцию, у которой my_collection.iter()
принимает &mut self
, вообще не возвращает итератор или даже не существует, и for x in &my_collection
будет работать, если я определю impl IntoIterator for &MyCollectionType
и не будет, если я этого не определю.
.iter()
и .iter_mut()
— это функции, которые добавлены по соглашению, чтобы было можно писать collection.iter().map(…)
вместо (&collection).into_iter().map(…)
.
RustyTips 0x01: Очень кратко о циклах в Rust