繁体   English   中英

在参数化函数中复制/克隆向量的惯用Rust方法是什么?

[英]What is the idiomatic Rust way to copy/clone a vector in a parameterized function?

我正在尝试编写一个参数化函数,它接受一个不可变的向量,克隆或复制它,对新的向量做一些事情(比如将其洗牌)并将其作为新拥有的向量返回。 如何做到这一点以及最常用的方法是什么?

尝试#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)中那样。

您的尝试#1几乎是正确的,您只需要将to_owned()移动到第一行:

fn shuffle<T>(vec: &mut [T]) {
    // ...
}

fn shuffle_create_new<T: Clone>(vec: &[T]) -> Vec<T> {
    let mut newvec = vec.to_vec();
    shuffle(&mut newvec);
    newvec
}

这是因为在切片上调用clone()会返回一个切片(即&[T] ),并且你不能从&[T]转到&mut [T]因为你不能选择引用的可变性(借用指针)。 但是,当您调用to_owned()时,您将获得Vec<T>的新实例,并且可以将其放入可变变量以获取可变向量。

从Rust 1.0开始, ToOwned特征中的slice::to_vecto_owned()方法可用于从&[T]创建Vec<T>

现在还有几种方法可以从Vec<T>获得&mut [T] :切片符号( &mut vec[..] ),deref转换( &mut *vec )或直接方法调用( vec.as_mut_slice() ,虽然这个被弃用了):

这可能是你想要的:

pub fn copy_shuffle<T: Clone>(vec: &Vec<T>) -> Vec<T> {
    let mut vec = vec.clone();
    shuffle(&mut vec);
    vec
}

要么

pub fn copy_shuffle<T: Clone>(vec: &[T]) -> Vec<T> {
    let mut vec = vec.to_vec();
    shuffle(&mut vec);
    vec
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM