【发布时间】:2014-02-17 15:26:15
【问题描述】:
我正在尝试编写一个参数化函数,该函数采用不可变向量,克隆或复制它,对新向量执行某些操作(例如随机播放)并将其作为新拥有的向量返回。如何做到这一点,最惯用的方法是什么?
尝试 #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 是可变的。我不明白为什么。
尝试 #2
pub fn shuffle_owned<T: Clone>(mut vec: Vec<T>) -> Vec<T> {
shuffle(&mut vec);
return vec;
}
虽然编译,但它并没有做我想要的。您传递给shuffle_owned 的向量被移动 到函数中,经过洗牌,然后将其所有权转移回调用者(通过返回值)。所以原来的向量被修改了。
我想知道如何传入一个不会发生变异的向量,但是将值克隆到一个新的装箱向量中并在完成时返回——就像你在函数式编程语言中所做的那样具有不可变的数据(例如 Clojure)。
【问题讨论】:
-
to _owned克隆[T]的每个元素,因此需要T来实现克隆(<T: Clone>) -
是的,这解释了错误。谢谢。
-
我已经更新了我的答案,因为您的建议修复了第一个错误,但我仍然没有弄清楚如何实现我的总体目标。
标签: rust