Задача 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, изменяет его, помещая в него элемент, а затем возвращает измененное…