Reflection 如何在Rust中获取结构字段名?

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

对于锈菌是否有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").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很好!您认为这个问题应该标记为重复的吗?您能增强它吗?等等,我会增强它。