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
- 首次发布