2016-05-10 30 views
6

Có một số điểm tương đương với số Object.keys() của JS đối với số struct của Rust không?Làm cách nào để lấy tên trường cấu trúc trong Rust?

Tôi cần thứ gì đó để tạo tiêu đề CSV (tôi sử dụng rust-csv) từ tên trường cấu trúc.

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() 
+0

Bạn không thể làm điều đó mà không có plugin * rustc * (chỉ hoạt động vào một đêm). – mcarton

+0

Cảm ơn @mcarton. Tôi sẽ đọc về [Compiler Plugins] (https://doc.rust-lang.org/book/compiler-plugins.html). Tôi thực sự muốn giữ một số dữ liệu ở một nơi, do đó, sử dụng tên của trường có thể là tuyệt vời. Và tôi có thể di chuyển đến hàng đêm, vì vậy bất kỳ sự trợ giúp nào được đánh giá cao. –

+3

Không có khả năng cần một trình biên dịch plugin cho usecase thực tế của bạn; có thể sử dụng '# [derive (RustcDecodable)]' như [được mô tả trong kho lưu trữ] (https://github.com/BurntSushi/rust-csv). Tuy nhiên, không trả lời câu hỏi mà bạn đang hỏi, đây là cách chung để liệt kê ** bất kỳ tên trường cấu trúc ** nào. Bạn cũ của tôi, [Vấn đề XY] (http://xyproblem.info/). – Shepmaster

Trả lời

7

Phương pháp lập trình meta chính hiện tại trong Rust là via macros. Trong trường hợp này, bạn có thể chụp tất cả các tên trường và sau đó thêm một phương thức trả về dạng chuỗi trong số họ:

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

Đối với macro tiên tiến, hãy chắc chắn kiểm tra The Little Book of Rust Macros.

+1

câu hỏi tương tự Logged và giải pháp: http://stackoverflow.com/a/29986760/996886 – melak47

+1

@ melak47 điểm tốt Bạn có nghĩ rằng câu hỏi này nên được đánh dấu là trùng lặp không? – Shepmaster

+0

bạn có thể cải thiện nó không? nó. – jayphelps

Các vấn đề liên quan