rust - 有没有办法在 proc-macro crate 中具有公共(public)特征?

标签 rust traits rust-crates rust-proc-macros

我有一个带有宏的 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 解决:

  • 包含 proc-macro
  • 使用的类型和特征定义的“内部” crate
  • proc-宏箱:
  • 依赖于内部 crate,所以它可以使用它的类型和特性

  • “公共(public)”箱子:
  • 取决于内部和 proc-macro crates
  • 重新导出您希望用户使用的所有类型、特征和宏


  • 每当您的宏在其生成的代码中提及共享类型时,您需要使用完全限定名称,这样用户就不需要导入它们。

    这种模式在野外的一些流行示例:
  • thiserror 取决于 thiserror-impl其中包含实际的宏
  • pin-project 取决于 pin-project-internal再次包含宏
  • darling 取决于 darling-coredarling-macro ,它本身也依赖于 darling-core
  • 关于rust - 有没有办法在 proc-macro crate 中具有公共(public)特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64398731/

    相关文章:

    rust - 无法将功能移至另一个文件?

    rust - 如何从表达式中获取 "return"?

    generics - 在不使用关联类型的情况下简化类型签名

    rust - 匹配两个参数和范围

    rust - 如何访问 crate 的 "tests"目录中的导出函数?

    rust - 初始化期间类型不明确

    rust - 是否可以将函数类型从签名中移出并移到 where 子句中?

    php - 如何使用特征 - Laravel 5.2

    macros - 如何在宏中包含唯一匹配案例的文档?

    rust - rustc-std-workspace-core crate 的用途是什么?