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>
}
}