Задача Rustlings: пошаговое руководство по решению move_semantics2.rs
Это двадцать четвёртый (24-й) выпуск серии Шорохи. В этом выпуске мы приводим решения упражнений Шорохи с подробными пояснениями. В этом выпуске мы решим задачу по move_semantics2.rs.
Предыдущее задание #Выпуск 23
Испытание:
// move_semantics2.rs // // Make the test pass by finding a way to keep both Vecs separate! // // Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand // for a hint. // I AM NOT DONE #[test] fn main() { let vec0 = vec![22, 44, 66]; let mut vec1 = fill_vec(vec0); assert_eq!(vec0, vec![22, 44, 66]); assert_eq!(vec1, vec![22, 44, 66, 88]); } fn fill_vec(vec: Vec<i32>) -> Vec<i32> { let mut vec = vec; vec.push(88); vec }
Если вы запустите код в своем редакторе, компилятор выдаст ошибку:
rror[E0382]: borrow of moved value: `vec0` --> src/lib.rs:16:5 | 12 | let vec0 = vec![22, 44, 66]; | ---- move occurs because `vec0` has type `Vec<i32>`, which does not implement the `Copy` trait 13 | 14 | let mut vec1 = fill_vec(vec0); | ---- value moved here 15 | 16 | assert_eq!(vec0, vec![22, 44, 66]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ value borrowed here after move | note: consider changing this parameter type in function `fill_vec` to borrow instead if owning the value isn't necessary --> src/lib.rs:20:18 | 20 | fn fill_vec(vec: Vec<i32>) -> Vec<i32> { | -------- ^^^^^^^^ this parameter takes ownership of the value | | | in this function = note: this error originates
Объяснение:
В коде вызова у нас есть функция fill_vec
, которая берет на себя управление параметром vec, изменяет его, помещая в него элемент, а затем возвращает измененное…