2017-02-08 11 views
3

複数のアイテムを展開するこの単純なマクロを考えてみると、これはどのようにマクロを引数として取ることができますか?複数の項目を含むマクロをマクロに渡すにはどうすればよいですか?

macro_rules! print_structs { 
    ($($t:ty)*) => ($(
     println!("{:?}", TypeId::of::<$t>()); 
    )*) 
} 

// expands one println per type! 
print_structs! { i8 i16 usize String } 

事前定義された型のマクロはどのように渡すことができますか?非稼働マクロの

例:

macro_rules! some_types { 
    () => { 
     i8 i16 usize String 
    } 
} 

print_structs! { some_types!() } 

は、問題を見てplay.rust-lang.orgたとえば、コメントを解除UNCOMMENT TO TEST行を参照してください。

はエラーを与える:macro expansion ignores token `i16` and any following


私はまた、例えば、含めるファイルにリストを入れてみました:

print_structs! { 
    include!("some_types.in") 
} 

...しかし、これはエラーを与える:expected type, found `include!("../struct_list.rs")`

答えて

3

これを調べると、マクロまたはincludeを使用してマクロ内のリストを展開できないようです。

コード生成はオプションですが、それは非常に関与していますので、この回答から除外します。

リストをマクロに渡す代わりに、マクロ名をリストで展開する汎用マクロに渡すのではなく、マクロをスワッピングすることで同様の機能を得ることができます。

HERESに作業例:

macro_rules! print_structs { 
    ($($t:ty)*) => ($(
     println!("{:?}", ::std::any::TypeId::of::<$t>()); 
    )*) 
} 

macro_rules! apply_macro_to_structs { 
    ($macro_id:ident) => { 
     $macro_id! { 
      i8 i16 usize String 
     } 
    } 
} 

fn test_a() { 
    // expands one println per type! 
    print_structs! { i8 i16 usize String } 
} 

fn test_b() { 
    // expand using a macro 
    apply_macro_to_structs!(print_structs); 

} 

fn main() { 
    test_a(); 
    test_b(); 
} 
関連する問題