在大型包装箱中有没有一种公共特性?

问题描述

我有一个带有宏的proc宏板条箱,当扩展该宏时,需要对Rust内置类型使用自定义特征实现。我试图在同一条板条箱中定义特征,但是Rust告诉我proc-macro条板箱只能有公共宏(带有#[proc_macro]注释的函数),其他任何事物都不能是公共的。因此,我将特征放入另一个板条箱中,并将它作为依赖宏放入proc-macro板条箱中。但是,这意味着任何想要使用我的proc宏板条箱的人也必须依赖于其他特征板条箱。

所以我想知道是否存在 可以将公共特征添加到proc-macro板条箱,或者以某种方式使proc-macro和trait板条箱链接起来以便最终用户可以试着没有一个就不要使用?如果不可能,唯一的解决方案就是记录依赖关系,这很脆弱。

解决方法

通常解决此问题的方法是完全不让用户依赖于您的proc-macro crate。

您的问题可以用3个板条箱解决:

  • “内部”板条箱,其中包含proc-macro使用的类型和特征定义
  • proc-macro板条箱:
    • 取决于内部箱子,因此可以使用其类型和特征
  • “公共”板条箱:
    • 取决于内部和proc宏板条箱
    • 重新导出您希望用户使用的所有类型,特征和宏

只要您的宏在其生成的代码中提及共享类型,就需要使用完全限定的名称,以便用户也无需导入它们。


这种模式在野外流行的一些例子:

  • thiserror取决于包含实际宏的thiserror-impl
  • pin-project取决于pin-project-internal,后者又包含宏
  • darling取决于darling-coredarling-macro,后者本身也取决于darling-core

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...