在rust的声明性宏中接受结构体字段?

t0ybt7op  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(188)

我想在声明性宏中接受结构成员,作为生成具有公共成员的枚举的简单方法(我想我必须这样做,因为我想用serde从预定义的JSON格式中重新定义),但它不起作用:
我认为应该工作:

macro_rules! test {
    ($field_1:tt, $field_2:tt) => {
        #[derive(Debug)]
        struct Test {
            first: String,
            $field_1,
            $field_2,
        }
    };
}

test!(a: i32, b: i32);

字符串
错误:

Compiling playground v0.0.1 (/playground)
error: no rules expected the token `:`
  --> src/lib.rs:12:8
   |
1  | macro_rules! test {
   | ----------------- when calling this macro
...
12 | test!(a: i32, b: i32);
   |        ^ no rules expected this token in macro call
   |
note: while trying to match `,`
  --> src/lib.rs:2:17
   |
2  |     ($field_1:tt, $field_2:tt) => {
   |                 ^

error: could not compile `playground` (lib) due to previous error


rust playground
有没有什么方法可以做到这一点,或者我必须求助于一个proc宏?

jutyujz0

jutyujz01#

TokenTree:tt)是“单个标记或标记树的分隔序列”您缺少分隔符/没有匹配足够的标记树(每个字段定义有三个)。
要做到这一点,您可以匹配组成字段定义的所有三个令牌树:

macro_rules! test {
    ($id1:ident : $type1:ty, $id2:ident: $type2:ty) => {
        #[derive(Debug)]
        struct Test {
            first: String,
            $id1: $type1,
            $id2: $type2,
        }
    };
}

字符串
或者对于任意数量的字段定义:

macro_rules! test {
    ($($id:ident : $type:ty),* $(,)?) => {
        #[derive(Debug)]
        struct Test {
            first: String,
            $($id : $type),*
        }
    };
}

相关问题