【问题标题】:Passing a data structure as an args to a proc macro attribute将数据结构作为 args 传递给 proc 宏属性
【发布时间】:2021-10-10 05:27:48
【问题描述】:

我正在尝试创建一个可在结构上使用的宏,在该宏中您可以获取另一个结构作为参数,然后连接结构字段。这是宏的代码

#[proc_macro_attribute]
pub fn cat(args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro:: TokenStream {
    let mut base_struct = parse_macro_input!(input as ItemStruct);
    let mut new_fields_struct = parse_macro_input!(args as ItemStruct);

    if let syn::Fields::Named(ref mut base_fields) = base_struct.fields {
        if let syn::Fields::Named(ref mut new_fields) = new_fields_struct.fields {
            for field in new_fields.named.iter() {
                base_fields.push(field.clone());
            }
        }
    }

    return quote! {
        #base_struct
    }.into();
}

这是我希望使用它的基本示例

struct new_fields{
    field: usize,
}

#[cat(new_fields)]
struct base_struct{
    base_field, usize,
}

但是,它只会将单词“new_fields”转换为 TokenStream,然后编译失败,因为它不是结构。有没有办法将结构作为参数“传递”给宏,而无需在宏用法中编写代码?

【问题讨论】:

    标签: rust quote rust-proc-macros syn


    【解决方案1】:

    有没有办法将结构作为参数“传递”给宏,而无需在宏用法中编写代码?

    没有。宏对给定的令牌进行操作,仅此而已。

    在不了解更多细节的情况下很难给出建议,但最接近您提供的内容是让您的宏生成另一个结构,以便它知道定义。你也许可以这样传递:

    #[cat(
        struct new_fields{
            field: usize,
        }
    )]
    struct base_struct{
        base_field, usize,
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      相关资源
      最近更新 更多