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

MIT 许可证

44KB
690

Arraygen

Crates.io Docs Twitter Buy Me a Coffee at ko-fi.com'

此包提供 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_arrayin_array 中使用的方法名称,以在每个生成的方法中包含这些字段。因此,在这个示例中,假设 gen_stringsget_names 都是由 gen_array 生成的,前者将包含字段 idname,而后者将包含字段 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