#traits #default #define #multiple

multi-default-trait-impl

为特质定义多个默认实现

3个版本

0.1.2 2019年9月6日
0.1.1 2019年9月6日
0.1.0 2019年9月6日

#204#define

29 每月下载量
用于 2 crates

LGPL-2.1-or-later

9KB
89 代码行

多重默认特质实现(multi-default-trait-impl)

为特质定义多个默认实现。

Latest Version Rust Documentation

此库包含两个属性宏:定义默认特质实现的 default_trait_impl,以及使用你已定义的默认特质实现的 trait_impl

这在测试时特别有用,当许多模拟类型将有非常相似的特质实现,但不想使用规范默认特质实现时。

示例

首先,为特质 Car 定义默认特质实现

#[default_trait_impl]
impl Car for NewCar {
    fn get_mileage(&self) -> Option<usize> { Some(6000) }
    fn has_bluetooth(&self) -> bool { true }
}

NewCar 不需要预先定义。

然后,为类型实现新的默认实现

struct NewOldFashionedCar;

#[trait_impl]
impl NewCar for NewOldFashionedCar {
    fn has_bluetooth(&self) -> bool { false }
}


struct WellUsedNewCar;

#[trait_impl]
impl NewCar for WellUsedNewCar {
    fn get_mileage(&self) -> Option<usize> { Some(100000) }
}

这将确保我们的结构体使用 NewCar 默认值,而无需更改规范 Car 默认实现

fn main() {
    assert_eq!(NewOldFashionedCar.get_mileage(), Some(6000));
    assert_eq!(NewOldFashionedCar.has_bluetooth(), false);
    assert_eq!(WellUsedNewCar.get_mileage(), Some(100000));
    assert_eq!(WellUsedNewCar.has_bluetooth(), true);
}

依赖项

~1.5MB
~35K SLoC