🦀 Rust-задача: неожиданный вывод из-за владения и `for`
fn main() {
let data = vec!["rust", "go", "zig"];
for item in data {
println!("{item}");
}
println!("{:?}", data);
}
❓ Что произойдёт при компиляции и запуске?
• a) Выведет
rust
, go
, zig
, затем ["rust", "go", "zig"]
• b) Ошибка компиляции:
data
уже перемещён • c) Всё выведет корректно, потому что
&str
копируются • d) Программа скомпилируется, но упадёт во время выполнения
💡 Разбор
for item in data
в Rust перемещает `data`, потому что Vec<T>
по умолчанию потребляется в IntoIterator
. Это значит, что после цикла data
больше не принадлежит функции main
.Попытка использовать
data
в println!
после этого приведёт к ошибке компиляции: value borrowed after move
.✅ **Правильный ответ:
🧠 **Вывод:** в Rust `for item in collection` по умолчанию вызывает `.into_iter()`, а не `.iter()`, и это **может забрать владение** коллекцией.
🔧 **Как избежать:**
Если нужно сохранить `data`, итерация должна быть по ссылке:
for item in &data {
println!("{item}");
}
println!("{:?}", data);
>>Click here to continue<<