В чем различие между .iter() и .into_iter() в Rust?
Этот вопрос проверяет понимание различий между двумя методами итераторов Rust — .iter() и .into_iter(), которые используются для перебора коллекций.
Короткий ответ
.iter() создает итератор, который заимствует элементы коллекции, не забирая их. .into_iter() забирает владение коллекцией и перемещает элементы из неё.
Длинный ответ
В Rust .iter() и .into_iter() используются для создания итераторов, но их поведение различается в плане владения и заимствования данных:
.iter():
- Создаёт итератор, который заимствует элементы коллекции.
- Элементы коллекции остаются доступными для дальнейшего использования после итерации.
- Подходит, когда нужно читать данные из коллекции, но не требуется её изменять или забирать данные.
- Пример:
let nums = vec![1, 2, 3];
let iter = nums.iter();
for &num in iter {
println!("{}", num); // Выводит 1, 2, 3
}
.into_iter():
- Перемещает элементы коллекции, т.е. забирает владение над коллекцией и её элементами.
- После использования .into_iter() коллекция больше не доступна, так как владение ею было передано итератору.
- Полезно, когда не нужно больше использовать коллекцию после того, как элементы из неё были перемещены.
- Пример:
let nums = vec![1, 2, 3];
let iter = nums.into_iter();
for num in iter {
println!("{}", num); // Выводит 1, 2, 3
}
// nums больше не доступен здесь
Используйте .iter() для заимствования элементов коллекции и .into_iter() для перемещения данных из коллекции, когда она больше не нужна.