2个版本
0.1.8 | 2019年11月25日 |
---|---|
0.1.7 | 2019年11月25日 |
#40 in #iter
27KB
377 行
Arraygen
此crate提供了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().iter_mut() {
**name = name.to_lowercase();
}
assert_eq!(
format!("{:?}", person),
"Person { first_name: \"ada\", last_name: \"lovelace\" }"
);
// PASSES !
// Notice how it was not lowercased on type definition
// 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
,指定方法名和返回类型。
#[derive(Arraygen)]
#[gen_array(fn get_strings: &String]
struct Foo {...}
在上面的代码中,结构体Foo
将有一个新方法,其签名如下: fn get_strings(&self) -> [&Strings; ?] {...}
。
in_array
属性
为了将结构体字段填充到Arraygen
方法中,您需要在希望包含的每个结构体字段上使用属性in_array
。
// inside a struct
#[in_array(get_strings)]
name: String,
#[in_array(get_strings)]
id: String,
您需要匹配gen_array
和in_array
中使用的同名方法,以将这些字段包含在生成的方法中。
文档
有关更多信息,请参阅文档页面。
限制
实际上没有特别的限制。您可以使用此派生宏来返回Copy对象、Trait对象,以及基本上任何可以作为结构体成员的对象。
此外,请注意,没有涉及动态内存分配。
唯一的缺点可能是在编译时间上略有影响。
关于语法
我对1.0版本的语法有所变动持开放态度。请参与语法建议问题,对此问题提出您的看法。
GettersByType
这个crate深受GettersByType的启发,它也是另一个允许你做同样事情的derive。但那个更具有意见性,灵活性较低,功能也较弱,唯一的优势是更简洁。这就是我决定着手这个新方案的原因。
许可证
MIT
依赖项
~1.5MB
~37K SLoC