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

使用Darling编写自定义proc_macro时出现“找不到table属性”错误

问题原因与解决步骤

核心原因

你只重导出了Model派生宏,但#[table]作为自定义属性,本身需要是一个**属性宏(proc-macro-attribute)**才能被Rust编译器识别。哪怕你在派生宏里用#[darling(attributes(table))]声明了要解析这个属性,编译器依然会因为找不到对应的属性宏定义而报错。

解决步骤

1. 在子crate(pg-worm-derive)中定义table属性宏

在pg-worm-derive/src/lib.rs里添加属性宏声明——我们只需要让编译器识别这个属性,不需要额外逻辑,直接返回原代码即可:

use proc_macro::TokenStream;

// 定义table属性宏,仅作为占位让编译器识别
#[proc_macro_attribute]
pub fn table(_attr: TokenStream, item: TokenStream) -> TokenStream {
    item
}

// 你的Model派生宏原代码
#[proc_macro_derive(Model, attributes(table))]
pub fn derive_model(input: TokenStream) -> TokenStream {
    // 原有的darling解析逻辑...
}

同时确保子crate的Cargo.toml开启proc-macro特性:

[lib]
proc-macro = true

2. 在主crate(pg-worm)中重导出属性宏

修改pg-worm/src/lib.rs,把属性宏和派生宏一起重导出:

// 同时重导出派生宏Model和属性宏table
pub use pg_worm_derive::{Model, table};

3. 在测试代码中导入使用

在测试或业务代码里同时导入两个宏:

use pg_worm::{Model, table};

#[table(table_name = "person")]
#[derive(Model)]
struct Person {
    id: i32,
    name: String,
}

这样编译器就能识别#[table]属性,派生宏也能正常解析其中的参数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:30:06