#tuple #manage #fields #declaring #set #struct #macro

named_tuple

一个用于声明一个管理 struct 中字段的 tuple 的宏

4 个版本

0.1.3 2019 年 4 月 21 日
0.1.2 2019 年 1 月 17 日
0.1.1 2019 年 1 月 16 日
0.1.0 2019 年 1 月 16 日

#8#declaring

Download history 40/week @ 2024-04-01 15/week @ 2024-04-08 10/week @ 2024-04-15 17/week @ 2024-04-22 13/week @ 2024-04-29 13/week @ 2024-05-06 23/week @ 2024-05-13 18/week @ 2024-05-20 13/week @ 2024-05-27 17/week @ 2024-06-03 15/week @ 2024-06-10 17/week @ 2024-06-17 14/week @ 2024-06-24 67/week @ 2024-07-15

83 每月下载次数
5 个包中使用 (直接使用 4 个)

MIT/Apache 许可协议

38KB
670 代码行

named-tuple.rs

一个用于声明一个管理 struct 中字段的 tuple 的宏。

Travis-CI Status Latest version Documentation License

入门指南

named-tuple.rs 可在 crates.io 上找到。建议在那里查找最新版本以及文档的最新构建链接。

在更新此 README 的最后,最新发布的版本可以这样使用

将以下依赖项添加到您的 Cargo 清单...

[dependencies]
named_tuple = "0.1"

...并查看 文档 了解如何使用它。

示例

#[macro_use]
extern crate named_tuple;

named_tuple!(
    #[derive(Clone, Copy, Debug, Default, Hash, PartialEq)]
    struct Human<'a> {
        name: &'a str,
        age: usize,
    }
);

named_tuple!(
    #[derive(Copy, Debug)]
    struct Endpoint(host, port);
);

fn main() {
    /// structs with named fields
    let mut human = Human::new("alice", 18);

    assert_eq!(Human::field_names(), &["name", "age"]);
    assert_eq!(human.fields(), (("name", "alice"), ("age", 18)));
    assert_eq!(human.field_values(), ("alice", 18));

    assert_eq!(human.name(), "alice");
    assert_eq!(human.age(), 18);

    assert_eq!((human.0).0, "alice");
    assert_eq!((human.0).1, 18);

    assert_eq!(format!("{:?}", human), "Human { name: \"alice\", age: 18 }");

    human.set_name("bob");
    assert_eq!(human, ("bob", 18));

    human.set_age(20);
    assert_eq!(human, Human::from(("bob", 20)));

    let t: (&str, usize) = human.into();

    assert_eq!(t, ("bob", 20));

    // tuple structs
    let mut endpoint = Endpoint::new("localhost", 80);

    assert_eq!(endpoint.field_names(), &["host", "port"]);
    assert_eq!(endpoint.fields(), (("host", "localhost"), ("port", 80)));
    assert_eq!(endpoint.field_values(), ("localhost", 80));

    assert_eq!(endpoint.host(), "localhost");
    assert_eq!(endpoint.port(), 80);

    assert_eq!(
        format!("{:?}", endpoint),
        "Endpoint { host: \"localhost\", port: 80 }"
    );

    endpoint.set_host("google.com");
    endpoint.set_port(443);

    assert_eq!(("google.com", 443), endpoint.into());
}

许可证

许可协议为以下之一

您可选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可协议定义的任何贡献,均将按照上述方式进行双许可,不附加任何额外的条款或条件。

依赖项

~2–12MB
~145K SLoC