4 个版本
0.2.2 | 2019年6月23日 |
---|---|
0.2.1 | 2019年6月20日 |
0.2.0 | 2019年6月17日 |
0.1.0 | 2019年6月16日 |
#1006 在 过程宏
37KB
1K SLoC
traitlit
该包定义了一个名为 lit
的属性。该属性将一个特征的单一实现转换为针对指定类型的单独实现。
假设我想使用 lit 定义一个 Zero
特征。
pub trait Zero {
fn zero() -> Self;
}
通常这可以通过手动为所需的类型实现特征或创建一个宏来生成一组特定的实现来实现。使用 lit
,我们可以简单地按以下方式实现。
#[lit(V = [usize, isize])]
impl Zero for V {
fn zero() -> Self {
0
}
}
这生成了两个实现,一个用于 usize
,另一个用于 isize
。这非常重复,因为大多数此类特征都需要在特定类别中的每个类型上实现。为此,lit
允许你使用 u_
而不是 u8
、u16
、u32
、u64
、u128
和 usize
,以及 i_
对应的签名类型。此外,lit
还接受 f_
,对应于 f32
和 f64
。有了这个,之前的例子就变成了
#[lit(V = u_ + i_)]
impl Zero for _ {
fn zero() -> Self {
0
}
}
然而,当前的实现对于浮点类型不会工作,因为 0
不是一个浮点字面量。这可以通过类型转换轻松解决。
#[lit(V = u_ + i_ + f_)]
impl Zero for V {
fn zero() -> Self {
0 as Self
}
}
为了进一步简化实现,我们可以将特征定义和实现结合起来
#[lit(V = u_ + i_ + f_)]
trait Zero {
fn zero() -> Self {
0 as Self
}
}
但是,这将假设特征中的所有实现都是个别实现的组成部分,而不是默认值。如果你想在你的特征中拥有默认值,请保持特征和实现的分离。
您可能已经注意到了注释中的 V
和 impl
块。您可以用任何有效的标识符替换 V
,所有该标识符的实例都将被适当替换。
依赖项
~2MB
~46K SLoC