复制结构体以传递给函数 - 此字段不实现 'Copy' [duplicate]

Copy a struct to pass to a function - this field does not implement `Copy` [duplicate]

提问人:Tampa 提问时间:1/13/2019 最后编辑:ShepmasterTampa 更新时间:1/14/2019 访问量:13059

问:

这是我的结构:

#[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`
struct rust move-semantics 按值传递

评论

0赞 Simon Whitehead 1/13/2019
Vec不实现 .因此,您必须使用数组或传递引用。Copy
2赞 Peter Hall 1/13/2019
“我正在尝试将我的结构传递给多个函数”——请您发布您这样做的代码。
0赞 trent 1/14/2019
我通过搜索 [如何实现 [rust]] 类型的复制]](stackoverflow.com/...) 找到了链接的问题。 之所以这样,是因为它包含一个 ,所以答案也同样适用。StringVec

答:

6赞 phimuemue 1/13/2019 #1

如果一个类型实现了 ,“复制隐式发生”,即你不必显式声明你想要复制该值。因为 implements ,它不能实现,防止你在不知不觉中不小心复制了值。CopyVecDropCopy

因此,只有 implements(如果包含的类型 implements ),以便您可以通过调用 显式复制向量。VecCloneCloneClone

同样,你应该三思而后行,如果真的应该派生,或者如果你真的想派生,所以你必须明确声明你想要一个副本。ArimaModelCopyClone

但是,如果您只想传入不同的函数,则可能需要借用它们(即 pass 或代替 )。ArimaModel&ArimaModel&mut ArimaModelArimaModel

评论

2赞 nickeb96 1/13/2019
您不能只为任何类型实现复制。它仅适用于基元和引用以及由可复制类型组成的结构/枚举。Op 的结构不是其中之一。Copy 对值进行逐字节复制,这不适用于具有堆分配的内容,例如 .Op 唯一的办法是每次将结构传递给函数时克隆他的结构,或者最好让他的函数引用。他/她也可以让他的结构包含 s 以外的内容。VecVec