当前位置: 首页 > 知识库问答 >
问题:

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

钱俊楚
2023-03-14

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

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

共有2个答案

萧心水
2023-03-14

这可能就是你想要的:

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
}
徐文彬
2023-03-14

您的尝试#1几乎是正确的,您只需将移动到_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()将返回一个切片(即

从Rust 1.0开始,可以使用ToOwned特性中的slice::to_vecto_owned()方法来创建Vec

现在还有几种方法可以获得

 类似资料:
  • 如果我克隆了以下类的一个实例,并在实例化时覆盖了一个方法,克隆会有被覆盖的方法吗?我在https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html和https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()中没有找到任何关于这种行为的内容。

  • 我对复制构造函数是新手,当我开始使用向量时,似乎无法让它们工作。 我在编译时遇到的错误是: 机器人cpp:复制构造函数中的Robot::Robot(const Robot 如何在复制构造函数中复制向量数组?

  • 问题内容: 我是Java的初学者,我想以一种简单的方式知道为什么您应该使用参数化构造函数而不是编译器提供的默认构造函数。 谢谢 问题答案: 默认构造函数将您的对象可能具有的所有属性设置为0,false等。如果要立即设置属性,则可以使用参数化的构造函数。当然,也可以使用您自己的构造函数为您提供在创建对象之前(技术上而言)执行代码的选项。 顺便说一句:“默认值不会为属性设置任何值”的答案是错误的。例如

  • 问题内容: 我有一个包含经纬度坐标列表的数据框: 我的目标是使用Haversine函数找出KM中每个项目之间的距离: 我的目标是得到一个看起来像result_df的数据框,其中的值是每个提供程序ID之间的距离: 我可以循环执行此操作,但是速度非常慢。我正在寻找一些帮助将其转换为向量化方法: 问题答案: 为了矢量化此代码,您将需要对完整的数据框进行操作,而不要对单个经纬度进行操作。我对此做了尝试。我

  • 我想在POI中使用OPCPackage和XSSFWorkbook打开一个excel文件。由于这个文件将在不同的线程中使用,我想避免重新打开该文件以节省时间(POI在打开一个xlsx文件时速度较慢)。所以我所做的是将工作簿保存在一个全局变量中,然后线程将访问这个全局变量并重用对象。 我遇到的问题是当我尝试重用对象时,它影响/修改了excel文件的原始数据。

  • 我喜欢克隆一个表格,从每个单元格中去掉EUR这个词。我尝试使用.RemoveByContent但得到错误“不是函数”。 这是我的代码: 下面是表格: 如何删除克隆元素中的字符串?