You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Rust结构体宏支持字段上的可选属性语句?

Rust宏保留结构体字段serde属性的解决方案

问题核心在于原宏的匹配规则未考虑字段上的属性,导致无法解析带有#[serde(...)]注解的字段。只需修改宏的匹配模式,添加对字段属性的捕获并在展开时保留即可解决。

修改后的完整宏代码:

macro_rules! Reflect
{
    (pub struct $name:ident {$($(#[$field_attrs:meta])* $field_name:ident : $field_type:ty,)*}) =>
    {
        #[derive(Debug, Clone, serde::Serialize)]
        #[serde(rename_all = "camelCase")]
        pub struct $name
        {
            $(#[$field_attrs:meta] pub $field_name : $field_type,)*
        }
    };
}

Reflect!(
pub struct Node
{
    name : String,
    #[serde(skip_serializing_if = "<[_]>::is_empty")]
    children : Vec::<usize>,
    rotation : na::UnitQuaternion::<f32>,
    translation : na::Vector3::<f32>,
    scale : na::Vector3::<f32>,
    skin : usize,
    mesh : usize,
}
);

关键修改说明:

  • 匹配模式中新增$(#[$field_attrs:meta])*,用于捕获字段上的任意数量属性(包括0个)。#[$field_attrs:meta]是Rust宏中解析#[...]格式属性的标准写法,meta元变量可兼容任意合法的属性内容。
  • 结构体展开部分同步加入#[$field_attrs:meta],将捕获到的属性原样输出,完整保留原字段的serde配置。
  • 保持原有逗号分隔的字段格式,确保宏能正确解析结构体的字段列表。

修改后宏即可正常编译,且字段上的serde属性会被完整保留生效。

内容的提问来源于stack exchange,提问作者Makogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:25:31