1 个不稳定版本
0.1.0 | 2024年4月2日 |
---|
#83 in #meta
用于 pinea
21KB
509 代码行
宏工具
包含一些有用的宏工具;
字段
为字段创建读写方法
例如
为Meta创建读取字段;
#[derive(Fields)]
#[r]
struct Meta {
field_a: String,
field_b: i32,
}
let meta = Meta {
field_a: String::new(),
field_b: 3,
};
let field_a: &String = meta.field_a();
let field_b: i32 = meta.field_b();
为结构体创建公共的写入字段;
#[derive(Fields)]
#[w]
struct Meta {
field_a: String,
field_b: i32,
}
let mut meta = Meta {
field_a: String::new(),
field_b: 3,
};
let field_a_mut: &mut String = meta.field_a_mut();
let field_b_mut: &mut i32 = meta.field_b_mut();
使用reducer为结构体创建自定义写入字段:impl FnOnce(Type) -> Type
#[derive(Fields)]
#[r]
struct Meta {
#[w(reducer)]
field_a: String,
field_b: i32,
}
let mut meta = Meta {
field_a: String::new(),
field_b: 3,
};
let field_b = meta.field_b();
meta.set_field_a(|field_a| field_a + &field_b.to_string());
使用set
为结构体创建自定义写入字段;
#[derive(Fields)]
#[r]
struct Meta {
#[w(set)]
field_a: String,
field_b: i32,
}
let mut meta = Meta {
field_a: String::new(),
field_b: 3,
};
let field_b = meta.field_b();
meta.set_field_a(meta.field_a().clone() + &field_b.to_string());
字段的可视性
如果结构体定义为pub
,则所有字段方法将定义为pub
;
如果结构体定义为private
,则所有字段方法将定义为private
;
或为字段方法自定义vis
;
mod private {
use picea_macro_tools::Fields;
#[derive(Fields)]
#[r]
pub struct Meta {
#[w(set, vis(pub(self)))]
field_a: String,
field_b: i32,
}
}
/// follow code will not compile
let mut meta = private::Meta::new();
meta.set_field_a(""); // function `set_field_a` is private
依赖
~300–760KB
~18K SLoC