主要观点:
- 给出两段 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
不满足PartialEq
和Eq
的要求,导致断言失败。 #[derive(Clone)]
的实现要求限制了派生类型的克隆能力。- 两种解决方法分别是创建 RFC 和编写自己的宏。
重要细节:
#[derive(Clone)]
要求所有字段和泛型参数都可克隆,不能简单假设泛型参数可被克隆。- 内置派生特质如
Clone
、PartialEq
、Eq
等都受此限制。 - 在
derive_more
仓库中提出关于以更宽松方式复制内置派生特质的问题。 - 可能是 Rust 类型系统在早期不够强大或存在疏忽导致此情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。