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).

questionAnswers(2)

yourAnswerToTheQuestion