【问题标题】:How can I implement Rust's Copy trait?如何实现 Rust 的 Copy 特征?
【发布时间】:2016-05-29 06:24:34
【问题描述】:

我正在尝试在 Rust 中初始化一个结构数组:

enum Direction {
    North,
    East,
    South,
    West,
}

struct RoadPoint {
    direction: Direction,
    index: i32,
}

// Initialise the array, but failed.
let data = [RoadPoint { direction: Direction::East, index: 1 }; 4]; 

当我尝试编译时,编译器抱怨 Copy 特征没有实现:

error[E0277]: the trait bound `main::RoadPoint: std::marker::Copy` is not satisfied
  --> src/main.rs:15:16
   |
15 |     let data = [RoadPoint { direction: Direction::East, index: 1 }; 4]; 
   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `main::RoadPoint`
   |
   = note: the `Copy` trait is required because the repeated element will be copied

Copy trait 如何实现?

【问题讨论】:

  • #[derive(Clone, Copy)] 是正确的方法,但为了记录,它并不神奇:手动实现这些特征很容易,尤其是在像你这样的简单情况下:impl Copy for Direction {} impl Clone for Direction { fn clone(&self) -> Self { *self } }

标签: rust traits


【解决方案1】:

您不必自己实现Copy;编译器可以为您派生它:

#[derive(Copy, Clone)]
enum Direction {
    North,
    East,
    South,
    West,
}

#[derive(Copy, Clone)]
struct RoadPoint {
    direction: Direction,
    index: i32,
}

请注意,实现Copy 的每个类型也必须实现CloneClone也可以推导出来。

【讨论】:

  • 为什么需要“克隆”?如果要实现 Copy,是否总是需要添加它?
  • @xetra11是的,CloneCopy 的超特征,所以每个实现Copy 的类型也需要实现Clone
  • 这并不完全是一个答案,但我更喜欢推导Clone 而不推导Copy。它允许开发人员明确地对元素执行.clone(),但它不会为您执行(这是Copy 的工作)。所以至少有理由让CloneCopy 分开存在;我会更进一步,假设Clone 实现了该方法,但Copy 使其自动化,两者之间没有冗余。
【解决方案2】:

只需在您的枚举之前添加 #[derive(Copy, Clone)]

如果你真的想要,你也可以

impl Copy for MyEnum {}

derive-attribute 在底层做同样的事情。

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 2015-09-19
    • 2016-06-02
    • 2020-08-15
    • 2021-08-20
    • 2022-08-15
    • 2022-12-11
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多