Разберите следующий фрагмент кода на Rust, объясните ошибку компиляции, связанную с владением/заимствованием, и предложите корректное перераспределение владения:
fn foo() { let v = vec![1,2,3]; let v2 = v; println!("{:?}", v); }

18 Ноя в 17:18
2 +1
0
Ответы
1
Коротко: проблема в том, что `Vec` при присваивании перемещается (move), а не копируется. В коде `let v2 = v;` владение вектора переходит к `v2`, поэтому попытка использовать `v` далее вызывает ошибку компиляции типа "use of moved value: `v`".
Исходный фрагмент (числовые литералы отмечены KaTeX):
`fn foo() { let v = vec![111,222,333]; let v2 = v; println!("{:?}", v); }`
Почему так: `Vec` реализует `Drop` и не реализует `Copy`, значит присваивание перемещает значение: после `let v2 = v;` переменная `v` больше не валидна.
Возможные корректные варианты перераспределения/общего доступа (коротко, с примерами):
1) Печатать `v2` (использовать новое владение):
`fn foo() { let v = vec![111,222,333]; let v2 = v; println!("{:?}", v2); }`
2) Заимствовать вместо перемещения (оба видят один вектор по ссылке):
`fn foo() { let v = vec![111,222,333]; let v2 = &v; println!("{:?}", v); /* или println!("{:?}", v2); */ }`
3) Клонировать, если нужен независимый дубль (дороже по памяти/времени):
`fn foo() { let v = vec![111,222,333]; let v2 = v.clone(); println!("{:?}", v); println!("{:?}", v2); }`
4) Разделяемое владение через `Rc` (для single-threaded) или `Arc` (для многопотока):
`use std::rc::Rc; fn foo() { let v = Rc::new(vec![111,222,333]); let v2 = Rc::clone(&v); println!("{:?}", v); println!("{:?}", v2); }`
Выберите вариант в зависимости от того, нужно ли вам единоличное владение, заимствование, копия или совместное владение.
18 Ноя в 17:26
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир