我正在try 编写一个参数化函数,它接受一个不可变的向量,克隆或复制它,对新向量执行某些操作(例如洗牌),并将其作为一个新拥有的向量返回.如何做到这一点?最惯用的方法是什么?
Attempt #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();
}
失败于:
error[E0596]: cannot borrow immutable borrowed content as mutable
--> src/main.rs:8:13
|
8 | shuffle(&mut newvec);
| ^^^^^^^^^^^ cannot borrow as mutable
尽管我宣布newvec
是可变的.我不明白为什么.
Attempt #2
pub fn shuffle_owned<T: Clone>(mut vec: Vec<T>) -> Vec<T> {
shuffle(&mut vec);
return vec;
}
虽然这可以编译,但它并不能满足我的要求.传入shuffle_owned
的向量将moved放入函数中,经过洗牌,然后将其所有权转移回调用方(通过返回值).原来的向量是modified.
我想知道如何传入一个将发生变异的向量,但将值克隆到一个新的装箱向量中,并在完成时返回——就像在具有不可变数据的函数式编程语言(如Clojure)中所做的那样.