Rust 有没有办法在proc宏板条箱中具有公共特性?

Rust 有没有办法在proc宏板条箱中具有公共特性?,rust,traits,rust-crates,rust-proc-macros,Rust,Traits,Rust Crates,Rust Proc Macros,我有一个proc宏板条箱,其中包含一个宏,当扩展时,需要对内置类型使用自定义trait实现。我试图在同一个板条箱中定义特性,但Rust告诉我,一个proc宏板条箱只能有公共宏(用.[proc#u macro]注释的函数),其他任何东西都不能是公共的。所以我把这个特性放在另一个板条箱中,在proc宏板条箱中作为依赖项包含它。但这意味着任何想要使用我的proc宏板条箱的人也必须依赖于另一个trait板条箱 因此,我想知道是否有办法将公共特征添加到proc宏板条箱中,或者以某种方式将proc宏和特征板

我有一个proc宏板条箱,其中包含一个宏,当扩展时,需要对内置类型使用自定义trait实现。我试图在同一个板条箱中定义特性,但Rust告诉我,一个proc宏板条箱只能有公共宏(用
.[proc#u macro]
注释的函数),其他任何东西都不能是公共的。所以我把这个特性放在另一个板条箱中,在proc宏板条箱中作为依赖项包含它。但这意味着任何想要使用我的proc宏板条箱的人也必须依赖于另一个trait板条箱


因此,我想知道是否有办法将公共特征添加到proc宏板条箱中,或者以某种方式将proc宏和特征板条箱链接起来,以便最终用户无法尝试使用其中一个而不使用另一个?如果两者都不可能,唯一的解决方案就是记录依赖关系,这种依赖关系有点脆弱。

通常的处理方法是让用户根本不依赖于您的proc宏板条箱

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

  • 包含proc宏使用的类型和特征定义的“内部”板条箱
  • 过程宏板条箱:
    • 取决于内部板条箱,因此可以使用其类型和特性
  • “公共”板条箱:
    • 取决于内部和proc宏机箱
    • 重新导出希望用户使用的所有类型、特征和宏
每当宏在其生成的代码中提到共享类型时,都需要使用完全限定的名称,这样用户就不需要导入它们


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

  • 取决于包含实际宏的
    此错误impl
  • 取决于同样包含宏的
    pin项目内部
  • 取决于
    达林核心
    达林宏
    ,而达林宏本身也取决于
    达林核心

感谢您提供这些信息,它消除了我对重新导出宏的一些疑虑。但我认为,如果我的宏扩展将“use trait\u clater::MyTrait”插入到客户机源代码中,那么无论如何,它们也必须直接依赖于其板条箱中的“trait\u clater”板条箱,对吗?不,您可以使宏使用完全限定路径,因此它们不必这样做。我将更新答案以添加这一点。非常感谢!铁锈太可怕了!=)