如何从“rust - attribute macro”中获取逗号分隔的属性列表?[重复]

db2dz4w8  于 2024-01-08  发布在  Mac
关注(0)|答案(1)|浏览(164)

此问题在此处已有答案

Parsing Attribute Macro Arguments in Rust(2个答案)
2天前关闭。
属性宏声明如下:

#[proc_macro_attribute]
pub fn my_custom_attribute(attr: TokenStream, item: TokenStream) -> TokenStream {}

字符串
如果我像这样使用属性宏

#[my_custom_attribute(GET, ",_,_,", 33)]
fn my_function(a: u32) {
    println!("why..? {}", a);
}


如何在my_custom_attribute中获取"GET""\,\_\,\_\,"33的数据?

blmhpbnm

blmhpbnm1#

syn是解析proc-macro输入的最流行的解决方案。
如果你的宏输入有一个标准的结构,你可以用这个结构定义一个类型,像这样:

use syn::{
    parse::{Parse, ParseStream},
    Ident, LitInt, LitStr, Token,
};

struct Input {
    arg1: Ident,        // Ident parses an identifier
    _comma1: Token![,], // Token![,] parses a comma
    arg2: LitStr        // LitStr parses a string literal
    _comma2: Token![,],
    arg3: LitInt,       // LitInt parses an integer literal
}

impl Parse for Input {
    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
        Ok(Input {
            arg1: input.parse()?,
            _comma1: input.parse()?,
            arg2: input.parse()?,
            _comma2: input.parse()?,
            arg3: input.parse()?,
        })
    }
}

字符串
然后使用syn::parse_macro_inputTokenStream解析为结构体:

#[proc_macro_attribute]
pub fn my_custom_attribute(attr: TokenStream, item: TokenStream) -> TokenStream {
    let input = syn::parse_macro_input!(attr as Input);

    // Process `input` as necessary
}

相关问题