gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:28:31 28 4
gpt4 key购买 nike

我有一个带有宏的 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/64288426/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com