能否通过derive宏修改或生成其作用的结构体内部代码?
关于Rust derive宏的作用范围说明
核心结论
- derive宏无法修改所作用的结构体内部定义,仅能在结构体外部生成额外的附加代码,因此不能通过derive宏为示例中的
Building结构体新增height: u8字段。
具体原因
Rust的derive宏属于特殊的属性宏类别,设计定位是为现有类型自动生成trait实现(比如我们常用的#[derive(Debug, Clone)]就是自动生成对应trait的实现代码)。它工作时只会读取被标记结构体/枚举的定义作为输入,输出的新代码会和原结构体定义并行存在,完全不会修改原有结构体的任何内容。
对应需求的解决方案
如果确实需要为结构体动态新增字段,你可以使用普通属性宏(直接以#[some_macro]标记在结构体定义上方,而非放在derive属性内)。普通属性宏支持替换原有结构体的完整定义,你可以在宏逻辑中解析原有结构体的字段列表,补充需要新增的字段后,输出完整的新结构体定义即可实现需求。
举个简单的实现逻辑示例:
- 接收原
Building结构体的输入Token流,解析出其可见性、结构体名、现有colour: String字段- 构造新的结构体定义,在原有字段后追加
height: u8字段- 输出新的结构体定义,直接替换掉原有代码
内容的提问来源于stack exchange,提问作者Timur Guvenkaya
相关产品推荐
相关产品推荐

