Jaki jest sposób rdzenia idiomatic do kopiowania / klonowania wektora w sparametryzowanej funkcji?
Próbuję napisać sparametryzowaną funkcję, która pobiera niezmienny wektor, klonuje go lub kopiuje, robi coś z nowym wektorem (np. Shuffle) i zwraca go jako nowy wektor. Jak można to zrobić i jaki jest najbardziej idiomatyczny sposób na to?
Próba # 1
pub fn shuffle<T>(vec: &mut [T]) {
// ... contents removed: it shuffles the vector in place
// ... so needs a mutable vector
}
pub fn shuffle_create_new<T: Clone>(vec: &[T]) -> Vec<T> {
let mut newvec = vec.clone();
shuffle(&mut newvec);
return newvec.to_owned();
}
Nie udaje się z:
error[E0596]: cannot borrow immutable borrowed content as mutable
--> src/main.rs:8:13
|
8 | shuffle(&mut newvec);
| ^^^^^^^^^^^ cannot borrow as mutable
mimo że oświadczyłemnewvec
jak zmienny. Nie rozumiem dlaczego.
Próba # 2
pub fn shuffle_owned<T: Clone>(mut vec: Vec<T>) -> Vec<T> {
shuffle(&mut vec);
return vec;
}
Podczas kompilacji nie robi tego, co chcę. Wektor, do którego przechodziszshuffle_owned
dostajeprzeniósł do funkcji, przetasowano, a następnie przeniesiono jej własność z powrotem do wywołującego (przez wartość zwracaną). Tak więc oryginalny wektor tozmodyfikowany.
Chcę wiedzieć, jak przekazać wektor, który będzienie być zmutowanym, ale sklonować wartości w nowym pudełku wektora i zwrócić je po zakończeniu - tak jak w funkcjonalnym języku programowania, który ma niezmienne dane (takie jak Clojure).