Разберите следующий фрагмент кода на Rust, объясните ошибку компиляции, связанную с владением/заимствованием, и предложите корректное перераспределение владения: fn foo() { let v = vec![1,2,3]; let v2 = v; println!("{:?}", v); }
Коротко: проблема в том, что `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); }` Выберите вариант в зависимости от того, нужно ли вам единоличное владение, заимствование, копия или совместное владение.
Исходный фрагмент (числовые литералы отмечены 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); }`
Выберите вариант в зависимости от того, нужно ли вам единоличное владение, заимствование, копия или совместное владение.