1 个不稳定版本
| 0.1.0 | 2021 年 11 月 13 日 |
|---|
#2845 in Rust 模式
7KB
constduck:编译时 duck typing 和反射
constduck 提供了一个 procmacro,可以启用任意结构类型上的编译时 duck typing 和反射。使用 constduck,你可以编写适用于任何具有正确字段的结构的泛型实现。它还允许你自动生成 trait 的实现,如 #[derive(..)],而无需 procmacro。请参阅 constduck/examples/debug-print.rs 中的示例。
用法
在结构体上派生 ConstDuck
#![feature(adt_const_params)]
use constduck::*;
#[derive(ConstDuck)]
struct Donald {
money: i64,
}
这为结构体 Donald 实现了 Field<"money"> 和 ConstructFrom<T: WithField<"money">>。你可以使用这些特质来编写泛型实现。例如
fn deduct_money<N, T: Field<"money", Ty = N>>(t: &mut T)
where N: Clone,
N: Sub<N, Output = N>,
N: From<i8> {
t.set(t.get().clone() - N::from(5i8));
}
deduct_money 将适用于任何具有字段 money 并派生 ConstDuck 的结构体。
constduck 的主要用途是在宏中,你想要使用字段的类型。例如
macro_rules! make_getter {
($struct:ident.$field:ident) => {
impl $struct {
pub fn $field(&self) -> &/* What to write here? */ {
&self.$field
}
}
}
}
struct Foo {
bar: String,
baz: u32,
}
make_getter!(Foo.bar);
在这种情况下,函数定义需要一个返回类型,但你没有足够的信息来指定类型。
(不稳定)
该项目需要 Rust nightly,并使用不完整的 adt_const_params 功能。你可能会遇到 ICEs。当前 API 在添加对元组结构和枚举的支持时可能会损坏。
许可证
constduck 采用 Mozilla Public License 2.0 (MPL2.0) 许可。请参阅 LICENSE 文件。
依赖关系
约 1.5MB
约 35K SLoC