Каков идиоматический способ 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).