解析 Rust 中的属性宏参数

Tim*_*aya 2 rust rust-macros

我正在编写一个属性宏并尝试解析那里传递的参数。

喜欢:#[macro(Arg1, Arg2)]

问题是我找不到正确的结构来解析它。我尝试将其解析为MetaandMetaList但它们似乎都不起作用。

pub fn some_macro(args: TokenStream, item: TokenStream) -> TokenStream {
let args_parsed = parse_macro_input!(args as MetaList);

////////

let args_parsed = parse_macro_input!(args as Meta);

}
Run Code Online (Sandbox Code Playgroud)

当我解析它时,MetaList我得到:“意外的输入结束,预期的括号”错误。

Cha*_*man 7

我假设你使用syn板条箱。


Proc 宏不会将其参数作为元获取,但在剥离#[name(...)]. 也就是说,args将包含Arg1, Arg2而不是#[macro(Arg1, Arg2)]MetaMetaList)所期望的。

你想要的是Punctuated

// Note that I put `syn::Path` but you can put whatever you want to parse between the commas.
// For example `syn::NestedMeta` if you want the full attribute syntax.
let args_parsed = syn::punctuated::Punctuated::<syn::Path, syn::Token![,]>::parse_terminated
    .parse(args)
    .unwrap(); // Better to turn it into a `compile_error!()`
Run Code Online (Sandbox Code Playgroud)

  • 我的问题是,在“Punctuated&lt;DATATYPE, SEPERATOR&gt;”中,如果我不需要分隔符,也就是说,我只想要一个参数,该怎么办? (2认同)