Macros 错误“不能与元组变量命名相同”是什么意思?

Macros 错误“不能与元组变量命名相同”是什么意思?,macros,rust,Macros,Rust,所以我在做一个基于 我有一个宏,它生成一个实体结构,如下所示: ($($name:ident : $component:ty,)*) => { /// A collection of pointers to components #[derive(Clone, Debug, Deserialize, PartialEq)] pub struct Entity { $( pub $name: Op

所以我在做一个基于

我有一个宏,它生成一个实体结构,如下所示:

($($name:ident : $component:ty,)*) => {
        /// A collection of pointers to components
        #[derive(Clone, Debug, Deserialize, PartialEq)]
        pub struct Entity {
            $(
            pub $name: Option<($component)>,
            )*
            children: Vec<Entity>
        }
}
impl Serialize for Entity {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
        where S: Serializer
    {
        let mut num_fields = 0;
         $(
             match self.$name {
                 Some => num_fields += 1,
                 None => {}
             };
          )*
          let mut state = serializer.serialize_struct("Entity", num_fields)?;
          // do serialize
          state.end()
    }
}

语法
self.$name
对于访问成员变量是正确的。正如@oli_obk-ker在问题的评论中所说,错误是由于使用了
Some
而不是
Some(pattern)

但是,您甚至不需要编写自己的
序列化。您可以在字段上使用,如果
f(&self.field)
返回true,则会导致生成的代码避免将其写出

($($name:ident : $component:ty,)*) => {
    /// A collection of pointers to components
    #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
    pub struct Entity {
        $(
          #[serde(skip_serializing_if = "Option::is_none")]  // <-- add this
          pub $name: Option<($component)>,
        )*
        children: Vec<Entity>
    }
}
($($name:ident:$component:ty,)*)=>{
///指向组件的指针的集合
#[派生(克隆、调试、序列化、反序列化、PartialEq)]
发布结构实体{
$(

#[serde(skip_serialization_if=“Option::is_none”)]//您使用的是
Some
而不是
Some(pattern)
。如果您不关心内容,请使用
self.$name.is_Some()
在if条件下而不是使用匹配。这让我觉得用
Ok
来获得
结果有点怪。我觉得需要
来获得
)结果有点怪,但我很懒。
         match self.$name {
             Some(_) => num_fields += 1,
//               ^~~
             None => {}
         };
//
// even better, use `if self.$name.is_some() { num_fields += 1; }`.
($($name:ident : $component:ty,)*) => {
    /// A collection of pointers to components
    #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
    pub struct Entity {
        $(
          #[serde(skip_serializing_if = "Option::is_none")]  // <-- add this
          pub $name: Option<($component)>,
        )*
        children: Vec<Entity>
    }
}