Macros Rust宏能否创建新的标识符?

Macros Rust宏能否创建新的标识符?,macros,code-generation,rust,Macros,Code Generation,Rust,我想创建一对setter/getter函数,其中的名称是基于共享组件自动生成的,但是我找不到任何宏规则生成新名称的示例 是否有一种方法可以生成类似于fn get_$iden()和SomeEnum::XX_get_$enum_iden的代码?否,而不是从Rust 1.22开始 如果您可以使用夜间构建 是:concat\n标识!(get_,$iden)这样可以创建新的标识符 但是不允许:解析器不允许到处调用宏,所以您可能希望在很多地方这样做都不起作用。在这种情况下,你只能靠自己了fn混凝土标识!(

我想创建一对setter/getter函数,其中的名称是基于共享组件自动生成的,但是我找不到任何宏规则生成新名称的示例


是否有一种方法可以生成类似于
fn get_$iden()
SomeEnum::XX_get_$enum_iden
的代码?

否,而不是从Rust 1.22开始


如果您可以使用夜间构建

是:
concat\n标识!(get_,$iden)
这样可以创建新的标识符

但是不允许:解析器不允许到处调用宏,所以您可能希望在很多地方这样做都不起作用。在这种情况下,你只能靠自己了<代码>fn混凝土标识!(get_,$iden)(…){…},例如,将不起作用。

我的板条箱提供了一种稳定的方法来创建新标识符,该标识符适用于任何锈蚀版本>=1.15.0的产品



如果您使用的是Rust>=1.31.0,我建议您使用我的板条箱,它提供了一种在宏中创建串联标识符的稳定方法

macro_rules! make_a_struct_and_getters {
    ($name:ident { $($field:ident),* }) => {
        // Define the struct. This expands to:
        //
        //     pub struct S {
        //         a: String,
        //         b: String,
        //         c: String,
        //     }
        pub struct $name {
            $(
                $field: String,
            )*
        }

        paste::item! {
            // An impl block with getters. Stuff in [<...>] is concatenated
            // together as one identifier. This expands to:
            //
            //     impl S {
            //         pub fn get_a(&self) -> &str { &self.a }
            //         pub fn get_b(&self) -> &str { &self.b }
            //         pub fn get_c(&self) -> &str { &self.c }
            //     }
            impl $name {
                $(
                    pub fn [<get_ $field>](&self) -> &str {
                        &self.$field
                    }
                )*
            }
        }
    };
}

make_a_struct_and_getters!(S { a, b, c });
macro\u规则!让你成为一个结构和获取者{
($name:ident{$($field:ident),*})=>{
//定义结构。这将扩展为:
//
//发布结构{
//a:弦,
//b:绳子,
//c:字符串,
//     }
发布结构$name{
$(
$field:String,
)*
}
粘贴::项目{
//[]中包含getter.Stuff的impl块被连接
//一起作为一个标识符。这将扩展为:
//
//impl S{
//pub fn get_a(&self)->&str{&self.a}
//pub fn get_b(&self)->&str{&self.b}
//pub fn get_c(&self)->&str{&self.c}
//     }
impl$name{
$(
发布fn[](&self)->&str{
&self.$field
}
)*
}
}
};
}
让你成为一个结构和获取者!(a、b、c);
macro_rules! make_a_struct_and_getters {
    ($name:ident { $($field:ident),* }) => {
        // Define the struct. This expands to:
        //
        //     pub struct S {
        //         a: String,
        //         b: String,
        //         c: String,
        //     }
        pub struct $name {
            $(
                $field: String,
            )*
        }

        paste::item! {
            // An impl block with getters. Stuff in [<...>] is concatenated
            // together as one identifier. This expands to:
            //
            //     impl S {
            //         pub fn get_a(&self) -> &str { &self.a }
            //         pub fn get_b(&self) -> &str { &self.b }
            //         pub fn get_c(&self) -> &str { &self.c }
            //     }
            impl $name {
                $(
                    pub fn [<get_ $field>](&self) -> &str {
                        &self.$field
                    }
                )*
            }
        }
    };
}

make_a_struct_and_getters!(S { a, b, c });