#getter #struct #field #derive #get #macro-derive

getters-by-type

为结构体中每种类型添加getter方法的派生宏

10个版本

0.2.6 2019年3月20日
0.2.5 2019年3月20日
0.1.2 2019年3月17日

#get中排名第9

每月下载量:29

MIT授权

25KB
287

Getters By Type

Crates.io Docs

此包提供了GettersByType派生宏,用于为结构体实现包含每种类型的getter方法。

生成的函数以前缀get_fields_开头,并以它们引用的类型名称结尾。

使用GettersByType的示例

#[derive(GettersByType)]
struct Foo {
    first: i32,
    second: i32,
    third: i32,
}

let object = Foo { first: 6, second: 12, third: 24 };

// Let's sum all the i32 fields with a fold expression:
assert_eq!(object.get_fields_i32().iter().fold(0, |acc, x| **x + acc), 42);

如您所注意到的,getter方法返回一个包含所有相同类型字段引用的数组。在这个例子中,方法get_fields_i32的返回类型将是[&i32; 3]

此包还提供了一个具有相同功能的mut版本GettersMutByType,为这些方法添加了可变版本。

在这种情况下,生成的函数以前缀get_mut_fields_开头。

使用GettersMutByType的示例

#[derive(GettersMutByType)]
struct Foo {
    first: Updater,
    second: Updater,
    ...
    onehundredth: Updater,
}

impl Updater {
    fn update(&mut self) {...}
}

let mut object = Foo::new();

// Let's update all the Updater fields
for updater in object.get_mut_fields_updater().iter_mut() {
    updater.update();
}

在这个例子中,方法get_mut_fields_updater的返回类型将是[&mut Updater; 3]。getter方法中不发生动态内存分配,因为它们只是返回一个固定数组中的引用。也没有生成不安全代码。

有关更多信息,请参阅文档页面

用法

使用Cargo,您可以将此行添加到您的Cargo.toml中

[dependencies]
getters-by-type = "*"

开发

目前此功能与原始类型以及许多其他引用和泛型类型一起工作,例如&strVec,但有些情况尚未完全覆盖,例如特例对象。想要贡献吗?拉取请求始终欢迎。因为这是我第一次使用过程宏,我想事情在底层可以有很大的改进,所以应该有一些低垂的果实。让我们去摘它们吧!

授权

MIT

依赖关系

~2MB
~46K SLoC