rust - 有没有办法在 proc-macro crate 中具有公共特征?
问题描述
我有一个带有宏的 proc-macro crate,当扩展时,需要为 Rust 内置类型使用自定义 trait 实现。我试图在同一个 crate 中定义 trait,但 Rust 告诉我一个 proc-macro crate 只能有公共宏(用 注释的函数#[proc_macro]
),其他都不能是公共的。所以我把 trait 放在另一个 crate 中,并在 proc-macro crate 中将它作为依赖项包含在内。但这意味着任何想要使用我的 proc-macro crate 的人也必须依赖另一个 trait crate。
所以我想知道是否有一种方法可以向 proc-macro crate 添加公共 trait,或者以某种方式使 proc-macro 和 trait crate 链接起来,这样最终用户就不能尝试在没有另一个的情况下使用一个?如果两者都不可能,唯一的解决方案是记录依赖关系,这有点脆弱。
解决方案
通常处理这种情况的方式是让用户完全不依赖于您的 proc-macro crate。
您的问题可以用 3 个板条箱解决:
- 包含 proc-macro 使用的类型和特征定义的“内部”板条箱
- proc-宏箱:
- 取决于内部 crate,所以它可以使用它的类型和特征
- “公共”箱子:
- 取决于内部和 proc-macro crates
- 重新导出您希望用户使用的所有类型、特征和宏
每当您的宏在其生成的代码中提及共享类型时,您需要使用完全限定名称,这样用户就不需要导入它们。
这种模式在野外的一些流行示例:
thiserror
取决于thiserror-impl
哪个包含实际的宏pin-project
取决于pin-project-internal
哪个再次包含宏darling
取决于darling-core
anddarling-macro
,它本身也取决于darling-core
推荐阅读
- firebase - 嵌套动态密钥的安全规则通配符
- angular - 如何在 Angular 中将 Google 地图与 PubNub 一起使用
- html - Flexbox 不会水平对齐
- c# - 在 UWP MapControl 中将点投影到 3D 地形表面
- ajax - 在.net核心中点击Ajax按钮获取JSON数据
- python-3.x - ec2 实例跳过终止的实例
- javascript - Javascript多维数组完整列设置
- ansible - ansible: failed_when 无法验证用户输入
- python - 为什么 tkinter 在不同的小部件中显示相同的图像,即使图像是单独加载的?
- django-rest-framework - DRF:如何在模型类上删除时在另一个模型类中插入数据