Каков идиоматический способ Rust для копирования / клонирования вектора в параметризованной функции?

Я пытаюсь написать параметризованную функцию, которая берет неизменный вектор, клонирует или копирует его, делает что-то с новым вектором (например, перемешивает его) и возвращает его как новый собственный вектор. Как это можно сделать и какой самый идиоматичный способ сделать это?

Попытка № 1

pub fn shuffle(vec: &mut [T]) {
    // ... contents removed: it shuffles the vector in place
    // ... so needs a mutable vector
}

pub fn shuffle_create_new(vec: &[T]) -> Vec {
    let mut newvec = vec.clone();
    shuffle(&mut newvec);
    return newvec.to_owned();
}

Сбой с:

error[E0596]: cannot borrow immutable borrowed content as mutable
 --> src/main.rs:8:13
  |
8 |     shuffle(&mut newvec);
  |             ^^^^^^^^^^^ cannot borrow as mutable

хотя я объявилnewvec как изменчивый Я нене понимаю почему.

Попытка № 2

pub fn shuffle_owned(mut vec: Vec) -> Vec {
    shuffle(&mut vec);
    return vec;
}

Хотя это компилируется, это неделай то, что я хочу. Вектор, в который вы переходитеshuffle_owned получаетпереехал в функцию, перетасовывается, а затем его право собственности передается обратно вызывающей стороне (через возвращаемое значение). Таким образом, оригинальный вектормодифицирована.

Я хочу знать, как передать вектор, который будетне быть мутированным, но иметь значения, клонированные в новый штучный вектор и возвращенные после завершения - как вы делаете это на функциональном языке программирования, который имеет неизменные данные (такие как Clojure).

Ответы на вопрос(2)

Ваш ответ на вопрос