23 个版本
0.3.2 | 2022年1月31日 |
---|---|
0.3.0 | 2021年6月17日 |
0.1.14 | 2020年9月12日 |
0.1.13 | 2020年5月21日 |
0.1.11 | 2019年11月25日 |
#36 in #iter
44KB
690 行
Arraygen
此包提供 Arraygen
推导宏,用于结构体,可以生成返回填充所选结构体字段数组的函数。
完整示例
#[derive(Arraygen, Debug)]
#[gen_array(fn get_names: &mut String)]
struct Person {
#[in_array(get_names)]
first_name: String,
#[in_array(get_names)]
last_name: String,
}
let mut person = Person {
first_name: "Ada".into(),
last_name: "Lovelace".into()
};
for name in person.get_names() {
*name = name.to_lowercase();
}
assert_eq!(
format!("{:?}", person),
"Person { first_name: \"ada\", last_name: \"lovelace\" }"
);
// PASSES !
// Notice how it was not lowercased on object creation
// but now it is.
如上图所示,gen_array
属性生成一个返回指定类型数组的函数。此外,in_array
属性说明了哪些字段包含在该方法返回的数组中。
Arraygen
在底层所做的只是生成以下 impl
impl Person {
#[inline(always)]
fn get_names(&mut self) -> [&mut String; 2] {
[&mut self.first_name, &mut self.last_name]
}
}
gen_array
属性
要生成 Arraygen
方法,您必须在结构体顶部使用 gen_array
属性。在那里,您将指定方法名称和返回类型。可选地,您还可以指定可见性或 implicit_select_all
子句。在下面的示例中,您将看到如何调整可见性
#[derive(Arraygen)]
#[gen_array(pub(crate) fn get_strings: &String)]
struct Foo {...}
在上面的代码中,结构体 Foo
将有一个具有以下签名的函数
pub(crate) fn get_strings(&self) -> [&String; ?] {...}
in_array
属性
要使用结构体字段填充您的 Arraygen
方法,您必须在每个您想要包含的结构体字段中使用 in_array
属性。
// inside a struct
#[in_array(get_strings)]
id: String,
#[in_array(get_strings, get_names)]
name: String,
您必须匹配 gen_array
和 in_array
中使用的方法名称,以在每个生成的方法中包含这些字段。因此,在这个示例中,假设 gen_strings
和 get_names
都是由 gen_array
生成的,前者将包含字段 id
和 name
,而后者将包含字段 name
。
还可以通过使用 implicit_select_all
子句完全省略 in_array
属性。请参阅文档中的 "implicit_select_all" 部分 以了解更多信息。
生成特例对象数组
特例对象完全受支持,请参阅文档中的特例对象部分 以查看一些工作示例。
通过类型隐式选择字段
使用条款 implicit_select_all
,您可以在不使用 in_array
的情况下选择字段,查看文档中的这一部分以查看示例。
文档
了解更多信息,请查看文档页面。
用法
使用 Cargo,您可以将此行添加到您的 Cargo.toml 中
[dependencies]
arraygen = "0.3.2"
关于语法
我愿意为 1.0 版本更改语法。参与语法建议问题,就此事发表您的意见。
已知问题
在某些情况下,错误消息可以改进。目前还没有适当的警告支持。Arraygen 在目前打印标准消息而不是警告。
GettersByType
此包深受GettersByType的启发,它是另一个 derive,允许您做同样的事情。但那个更具有观点性,更不灵活,更不强大,唯一的优点是更简洁。这就是我决定开发这个新方案的原因。
许可证
MIT
依赖关系
~1.5MB
~35K SLoC