6 个版本 (稳定版)
| 1.2.3 | 2024年7月16日 |
|---|---|
| 1.1.2 | 2024年5月13日 |
| 1.1.0 | 2024年4月3日 |
| 1.0.0 | 2022年6月17日 |
| 0.1.0 | 2021年6月28日 |
#561 in Rust 模式
每月下载量 439
58KB
1.5K SLoC
iderive:内部 derive
iderive 是 derive 的直接依赖泛型边界的替换方案。它仅检查结构体的字段类型以确定是否可以派生特征。
示例
#[derive(Clone, Copy)]
struct TaggedIndex<T: ?Sized> {
index: usize,
_tag: PhantomData<T>,
}
let a = TaggedIndex::<String> { index: 0, _tag: PhantomData };
let b = a;
let c = a; // Error: Value used after move
这不会工作,因为 derive 需要 T 实现 Copy,以便对 TaggedIndex 进行派生。
相比之下,iderive 只检查结构体的字段以确定是否可以派生特征。因为 usize 和 PhantomData<T> 无论 T 的类型如何都实现了 Copy,所以 iderive(Copy) 将为 TaggedIndex 实现 Copy。
#[iderive(Clone, Copy)]
struct TaggedIndex<T: ?Sized> {
index: usize,
_tag: PhantomData<T>,
}
let a = TaggedIndex::<String> { index: 0, _tag: PhantomData };
let b = a;
let c = a; // Works!
支持的特征
iderive 目前实现了 Clone、Copy、Debug、Default、PartialEq、Eq、PartialOrd、Ord 和 Hash。
版本历史
- 1.2.3
- 修复字段可见性、属性和函数特征边界的解析
- 1.2.0
- 重写;iderive 现在没有依赖
- 不要使用规范实现,因为这会破坏其他特征失败的边界
- 1.1.2
- 移除在1.1.1中添加的非详尽支持,因为当所有字段都显示时,这并没有意义。这与
#[derive(Debug)]的输出相匹配。
- 移除在1.1.1中添加的非详尽支持,因为当所有字段都显示时,这并没有意义。这与
- 1.1.1
- 在
Debug特质的输出中指明非详尽性 - 防止对
bool类型的重新定义 - 不需要syn的
full特性 - 添加更多许可选项
- 在
- 1.1.0
- 如果
Copy/Ord也被推导,则使用Clone/PartialOrd的规范实现 - 更新到syn 2.0
- 如果
- 1.0.0
- 移除意外留下的调试输出
- 0.1.0
- 首次发布