#integer #numeric #macro #proc-macro #generate

nightly bin traitlit

该包公开了一个属性,用于为整数和浮点类型实现特征

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过程宏

MIT 许可证

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_ 而不是 u8u16u32u64u128usize,以及 i_ 对应的签名类型。此外,lit 还接受 f_,对应于 f32f64。有了这个,之前的例子就变成了

#[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
    }
}

但是,这将假设特征中的所有实现都是个别实现的组成部分,而不是默认值。如果你想在你的特征中拥有默认值,请保持特征和实现的分离。

您可能已经注意到了注释中的 Vimpl 块。您可以用任何有效的标识符替换 V,所有该标识符的实例都将被适当替换。

依赖项

~2MB
~46K SLoC