#derive #proc-macro #traits #copy #bounds #generic #replace

iderive

derive 的直接依赖泛型边界的不替换方案

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 模式

Download history 236/week @ 2024-05-12 21/week @ 2024-05-19 1/week @ 2024-06-09 375/week @ 2024-07-14 1/week @ 2024-07-21 63/week @ 2024-07-28

每月下载量 439

Zlib OR MIT OR Apache-2.0 OR BSL-1.0

58KB
1.5K SLoC

iderive:内部 derive

iderivederive 的直接依赖泛型边界的替换方案。它仅检查结构体的字段类型以确定是否可以派生特征。

示例

#[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 只检查结构体的字段以确定是否可以派生特征。因为 usizePhantomData<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 目前实现了 CloneCopyDebugDefaultPartialEqEqPartialOrdOrdHash

版本历史

  • 1.2.3
    • 修复字段可见性、属性和函数特征边界的解析
  • 1.2.0
    • 重写;iderive 现在没有依赖
    • 不要使用规范实现,因为这会破坏其他特征失败的边界
  • 1.1.2
    • 移除在1.1.1中添加的非详尽支持,因为当所有字段都显示时,这并没有意义。这与#[derive(Debug)]的输出相匹配。
  • 1.1.1
    • Debug特质的输出中指明非详尽性
    • 防止对bool类型的重新定义
    • 不需要syn的full特性
    • 添加更多许可选项
  • 1.1.0
    • 如果Copy/Ord也被推导,则使用Clone/PartialOrd的规范实现
    • 更新到syn 2.0
  • 1.0.0
    • 移除意外留下的调试输出
  • 0.1.0
    • 首次发布

无运行时依赖