我有一个带有宏的 proc-macro crate,当扩展时,需要为 Rust 内置类型使用自定义 trait 实现。我试图在同一个 crate 中定义 trait,但 Rust 告诉我一个 proc-macro crate 只能有公共(public)宏(用 #[proc_macro]
注释的函数),其他都不能是公共(public)的。所以我把 trait 放在另一个 crate 中,并在 proc-macro crate 中将它作为依赖项包含在内。但这意味着任何想要使用我的 proc-macro crate 的人也必须依赖另一个 trait crate。
所以我想知道是否有一种方法可以将公共(public)特征添加到 proc-macro crate,或者以某种方式使 proc-macro 和 trait crate 链接起来,这样最终用户就不能尝试在没有另一个的情况下使用一个?如果两者都不可能,唯一的解决方案是记录依赖关系,这有点脆弱。
最佳答案
通常处理这种情况的方式是让用户完全不依赖于您的 proc-macro crate。
您的问题可以用 3 个 crate 解决:
每当您的宏在其生成的代码中提及共享类型时,您需要使用完全限定名称,这样用户就不需要导入它们。
这种模式在野外的一些流行示例:
thiserror
取决于 thiserror-impl
其中包含实际的宏 pin-project
取决于 pin-project-internal
再次包含宏 darling
取决于 darling-core
和 darling-macro
,它本身也依赖于 darling-core
关于rust - 有没有办法在 proc-macro crate 中具有公共(public)特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64398731/