`#[derive(Clone)]` 是有问题的。

主要观点:

  • 给出两段 Rust 代码,询问是否应编译,第一段代码尝试克隆包含不可克隆类型的WrapArc结构,第二段代码尝试使用WrapAlwaysEq结构进行相等性断言,两段代码均无法编译。
  • 解释 Rust 编译器中#[derive(Clone)]的实现要求,即所有字段和泛型参数都必须是Clone,但不能简单地要求所有泛型参数都可克隆,这适用于几乎所有内置派生特质。
  • 提出两种解决方法,一种是创建 Rust RFC 并在未来的 Rust 版本中稳定化(需 4 年以上),另一种是编写自己的宏来生成正确的代码。已在derive_more仓库中提出相关问题,若不被接受可能会创建自己的 crate 并在crates.io上发布。

关键信息:

  • 第一段代码中WrapArc(Arc::new(NoClone))包含不可克隆类型NoClone,导致克隆失败。
  • 第二段代码中WrapAlwaysEq(AlwaysEq(NotEq)),其中NotEq不满足PartialEqEq的要求,导致断言失败。
  • #[derive(Clone)]的实现要求限制了派生类型的克隆能力。
  • 两种解决方法分别是创建 RFC 和编写自己的宏。

重要细节:

  • #[derive(Clone)]要求所有字段和泛型参数都可克隆,不能简单假设泛型参数可被克隆。
  • 内置派生特质如ClonePartialEqEq等都受此限制。
  • derive_more仓库中提出关于以更宽松方式复制内置派生特质的问题。
  • 可能是 Rust 类型系统在早期不够强大或存在疏忽导致此情况。
阅读 10
0 条评论