【问题标题】:Copy a struct to pass to a function - this field does not implement `Copy` [duplicate]复制结构以传递给函数 - 此字段未实现“复制”[重复]
【发布时间】:2019-06-07 15:26:12
【问题描述】:

这是我的结构:

#[derive(Copy, Clone)]
pub struct ArimaModel {
    p: u8,
    d: u8,
    q: u8,
    holdout_length: u16,
    max_ar_lag: u8,
    max_ma_lag: u8,
    df_lags: u8,
    time_series: Vec<f64>,
    ar_lags: Vec<usize>,
}

我正在尝试将我的结构传递给多个函数。

这是我的错误:

error[E0204]: the trait `Copy` may not be implemented for this type
  --> src/lib.rs:1:10
   |
1  | #[derive(Copy, Clone)]
   |          ^^^^
...
10 |     time_series: Vec<f64>,
   |     --------------------- this field does not implement `Copy`
11 |     ar_lags: Vec<usize>,
   |     ------------------- this field does not implement `Copy`

【问题讨论】:

  • Vec 没有实现Copy。因此,您必须使用数组或传递引用。
  • “我正在尝试将我的结构传递给多个函数” — 请您在执行该操作的位置发布代码。
  • 我通过搜索 [how to implement copy for a type [rust]](stackoverflow.com/…) 找到了链接的问题。 String 是这样的,因为它包含一个Vec,所以答案也同样适用。

标签: struct rust move-semantics pass-by-value


【解决方案1】:

如果一个类型实现了Copy"copies happen implicitly",也就是说,您不必明确声明您要复制该值。因为Vec实现了Drop,所以它不能实现Copy,防止你在不注意的情况下意外复制值。

因此,Vec 只实现了Clone(如果包含的类型实现了Clone),因此您可以通过调用Clone 显式复制向量。

同样,如果ArimaModel 真的应该派生Copy,或者您真的想派生Clone,您应该三思而后行,以便您必须明确声明您想要一个副本。

但如果您只想将ArimaModel 传递给不同的函数,您可能需要借用它们(即传递&amp;ArimaModel&amp;mut ArimaModel 而不是ArimaModel)。

【讨论】:

  • 你不能为任何类型实现复制。它只适用于原语和引用,以及由可复制类型组成的结构/枚举。 Op 的结构不是其中之一。 Copy 对值进行逐字节复制,这不适用于像Vec 这样的堆分配。 Op 唯一的办法是每次将他的结构传递给函数时克隆它,或者最好让他的函数引用。他/她还可以让他的结构包含Vecs 以外的其他内容。
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 2021-04-04
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多