Reflection 如何在Rust中获取结构字段名?
对于锈菌是否有JS的等效物 我需要一些东西从结构字段名生成CSV头(我使用)Reflection 如何在Rust中获取结构字段名?,reflection,rust,introspection,Reflection,Rust,Introspection,对于锈菌是否有JS的等效物 我需要一些东西从结构字段名生成CSV头(我使用) struct Export { first_name: String, last_name: String, gender: String, date_of_birth: String, address: String } //... some code let mut wrtr = Writer::from_file("/home/me/export.csv").unwra
struct Export {
first_name: String,
last_name: String,
gender: String,
date_of_birth: String,
address: String
}
//... some code
let mut wrtr = Writer::from_file("/home/me/export.csv").unwrap().delimiter(b'\t');
wrtr.encode(/* WHAT TO WRITE HERE TO GET STRUCT NAMES as tuple of strings or somethings */).is_ok()
Rust中当前元编程的主要方法是。在这种情况下,您可以捕获所有字段名,然后添加一个方法,返回字段的字符串形式:
macro_rules! zoom_and_enhance {
(struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
struct $name {
$($fname : $ftype),*
}
impl $name {
fn field_names() -> &'static [&'static str] {
static NAMES: &'static [&'static str] = &[$(stringify!($fname)),*];
NAMES
}
}
}
}
zoom_and_enhance!{
struct Export {
first_name: String,
last_name: String,
gender: String,
date_of_birth: String,
address: String
}
}
fn main() {
println!("{:?}", Export::field_names());
}
对于高级宏,请务必查看。如果没有rustc插件(只能在夜间使用),则无法执行此操作。谢谢@mcarton。我会读到的。我真的很喜欢将某些数据保存在一个地方,所以使用字段的名称可能会很棒。我可以搬到夜间,所以任何帮助都很感激。不太可能需要编译器插件来满足您的实际用例;可能可以将
#[派生(rustcdecoble)]
用作。但没有回答您提出的问题,这是列出任何结构字段名的通用方法。我的老朋友。这也可以通过实现您自己的过程宏来实现,您可以在其中解析AST,并为您的结构创建一个trait实现,该实现返回字段名。我在两周前亲自做过,但是代码没有公开,这个问题已经结束了。所以只要让你知道这是可能的,我会在一周内公布。如果您对这个解决方案感兴趣,我可以在这里告诉您(它所需要的只是将#[派生(内省)]
添加到您的枚举或结构中。类似的问题和解决方案:@melak47很好!您认为这个问题应该标记为重复的吗?您能增强它吗?等等,我会增强它。