1 个不稳定版本
0.1.0 | 2023 年 7 月 6 日 |
---|
#29 在 #field-name
976 每月下载量
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]
。