#struct-fields #struct #macro-derive #string #derive

set_field

通过字符串在结构体上设置字段

2 个版本

0.1.1 2023 年 9 月 9 日
0.1.0 2023 年 9 月 9 日

Rust 模式 中排名 #2723

MIT 许可证

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