2 个版本
0.1.1 | 2023 年 9 月 9 日 |
---|---|
0.1.0 | 2023 年 9 月 9 日 |
在 Rust 模式 中排名 #2723
5KB
set_field:结构体的 Rust derive 宏
通过字符串在结构体上设置字段。
SetField 特征
pub trait SetField<T> {
fn set_field(&mut self, field: &str, value: T) -> bool;
}
示例
use set_field::SetField;
#[derive(SetField)]
struct Foo {
a: i32,
b: Option<bool>,
c: i32,
}
fn test() {
let mut t = Foo { a: 777, b: None, c: 0 };
// return true on success:
assert_eq!(t.set_field("a", 888), true);
// return true on success:
assert_eq!(t.set_field("b", Some(true)), true);
assert_eq!(t.a, 888);
assert_eq!(t.b, Some(true));
// return false on nonexistent field:
assert_eq!(t.set_field("d", 0), false);
// return false on wrong type:
assert_eq!(t.set_field("b", 0), false);
// won't compile:
// assert_eq!(t.set_field("a", 0.0), false);
}
- set_field 在成功时返回 true。
- 如果字段不存在,set_field 返回 false。
- 如果尝试将字段设置为错误的类型,set_field 返回 false。
从上面的 Foo 结构体扩展
SetField 宏将 Foo 扩展为以下内容
struct Foo {
a: i32,
b: Option<bool>,
c: i32,
}
impl SetField<i32> for Foo {
fn set_field(&mut self, field: &str, value: i32) -> bool {
match field {
"a" => {
self.a = value;
true
}
"c" => {
self.c = value;
true
}
_ => false,
}
}
}
impl SetField<Option<bool>> for Foo {
fn set_field(&mut self, field: &str, value: Option<bool>) -> bool {
match field {
"b" => {
self.b = value;
true
}
_ => false,
}
}
}
依赖项
依赖项
~260–710KB
~17K SLoC