#struct-fields #struct #array #field #iter #derive

arraygen-docfix

从结构体字段生成数组的派生宏

2个版本

0.1.8 2019年11月25日
0.1.7 2019年11月25日

#40 in #iter

MIT许可证

27KB
377

Arraygen

Crates.io Docs

此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_arrayin_array中使用的同名方法,以将这些字段包含在生成的方法中。

文档

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

限制

实际上没有特别的限制。您可以使用此派生宏来返回Copy对象、Trait对象,以及基本上任何可以作为结构体成员的对象。

此外,请注意,没有涉及动态内存分配。

唯一的缺点可能是在编译时间上略有影响。

关于语法

我对1.0版本的语法有所变动持开放态度。请参与语法建议问题,对此问题提出您的看法。

GettersByType

这个crate深受GettersByType的启发,它也是另一个允许你做同样事情的derive。但那个更具有意见性,灵活性较低,功能也较弱,唯一的优势是更简洁。这就是我决定着手这个新方案的原因。

许可证

MIT

依赖项

~1.5MB
~37K SLoC