Rust's struct是否有JS's Object.keys()的等效物?

我需要一些东西来从 struct 字段名生成CSV标题(我使用rust-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中当前元编程的主要方法是via macros.在这种情况下,您可以捕获所有字段名,然后添加一个方法,返回它们的字符串形式:

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());
}

对于高级宏,请务必查看The Little Book of Rust Macros.

Rust相关问答推荐

as操作符如何将enum转换为int?

为什么函数不接受选项T参数的所有权?

为什么类型需要在这个代码中手动指定,在rust?

将大小为零的类型实例存储到空指针中

新创建的变量的绑定生存期

如何循环遍历0..V.len()-1何时v可能为空?

可以为rust构建脚本编写单元测试吗?

如果变量本身不是None,如何返回;如果没有,则返回None&Quot;?

获取已知数量的输入

如何获取光标下的像素 colored颜色 ?

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

Rust 并行获取对 ndarray 的每个元素的可变引用

为什么我们有两种方法来包含 serde_derive?

切片不能被 `usize` 索引?

是否可以在 Rust 中的特定字符上实现特征?

我如何将 google_gmail1::Gmail> 传递给线程生成?

意外的正则表达式模式匹配

如何将切片推入数组?

通用类型,不同于输入类型,作为函数的返回值