复制结构以传递给函数 - 该字段未实现“复制”

Tam*_*mpa 4 struct pass-by-value move-semantics rust

这是我的结构:

#[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>,
}
Run Code Online (Sandbox Code Playgroud)

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

这是我的错误:

#[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>,
}
Run Code Online (Sandbox Code Playgroud)

phi*_*mue 6

如果类型实现“隐式复制”Copy,即您不必显式声明要复制该值。因为实现了,所以它无法实现,从而防止您在没有注意到的情况下意外复制值。VecDropCopy

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

同样,您应该三思而后行,是否ArimaModel应该真正派生Copy或您实际上想要派生Clone,以便您必须明确声明您想要一个副本。

但如果您只想传递ArimaModel到不同的函数,您可能需要借用它们(即传递&ArimaModel&mut ArimaModel代替 ArimaModel)。

  • 您不能为任何类型实现复制。它仅适用于原语和引用以及由可复制类型组成的结构/枚举等。Op 的结构不是其中之一。Copy 对值进行逐字节复制,这对于像“Vec”这样的堆分配的东西不起作用。Op 唯一的办法是每次将其结构传递给函数时克隆其结构,或者最好让其函数引用。他/她还可以让他的结构包含除“Vec”之外的其他内容。 (2认同)