#struct-fields #field-name #struct #name #macro

不依赖 std field

静态验证的 struct 字段名作为字符串

1 个不稳定版本

0.1.0 2023 年 7 月 6 日

#29#field-name

Download history 9/week @ 2024-03-28 10/week @ 2024-04-04 16/week @ 2024-06-20 960/week @ 2024-06-27

976 每月下载量

MIT/Apache

8KB

field

静态验证的 struct 字段名作为字符串。

有关更多详细信息,请参阅文档

安装

将以下内容添加到您的 Cargo 清单文件(Cargo.toml)中

[dependencies]
field = "0.1.0"

或者,只需运行 cargo add field

依赖项

field 没有依赖项,并且默认与 #[no_std] 兼容。

许可证

根据您的选择,许可协议为

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的任何贡献,都应双许可如上所述,不附加任何额外条款或条件。


lib.rs:

静态验证的 struct 字段名作为字符串。

field! 宏在验证指定的 struct 上存在字段后,将评估为该字段的名字。类型必须在作用域内,并且字段必须在宏调用点可见(可访问)。

用法

使用宏 field!(field @ Struct)

use field::*;

struct User {
    name: String,
    age: u32,
}

let name = field!(name @ User);
assert_eq!(name, "name");

let age = field!(age @ User);
assert_eq!(age, "age");

不在指定 struct 上的字段或不在作用域内的类型将导致编译错误

// This fails because there is no field named "address" on "User"
let address = field!(address @ User);

// This fails because their is no struct named "NonExistent"
let foo = field!(whatever @ NonExistent);

泛型

field! 也与泛型类型一起工作,只要提供了具体类型参数

use field::*;

struct Pair<T> {
    first: T,
    second: T,
}

let first = field!(first @ Pair<()>);
assert_eq!(first, "first");

// Any type can be used for the type parameter(s)
let second = field!(second @ Pair<i32>);
assert_eq!(second, "second");

路径

没错,field! 也可以与路径语法一起使用

use field::*;

mod wrap {
    pub struct Wrap<T> {
        pub inner: T, // Must be pub so that it is visible at the point of invocation
    }
}

let inner = field!(inner @ wrap::Wrap<()>);
assert_eq!(inner, "inner");

可见性

指定的字段和 struct 必须在宏调用点可见(即可访问)

use field::*;

mod int {
    pub struct Int {
        pub int: i32,
    }
}

let int = field!(int @ int::Int);
assert_eq!(int, "int");

不可见类型或字段将导致编译错误

use field::*;

mod example {
    struct Secret {
        pub secret: String,
    }

    pub struct Empty {
        empty: ()
    }
}

// This fails because the "Secret" struct is not visible to the outer module
let secret = field!(secret @ example::Secret);

// This fails because the "empty" field is not visible to the outer module
let empty = field!(empty @ example::Empty);

依赖项

该软件包完全无依赖。默认支持 #[no_std]

无运行时依赖