在Rust的程序宏中使用$ crate?

时间:2017-07-06 13:37:43

标签: macros rust

我知道$crate变量是什么,但据我所知,它不能在程序宏中使用。还有另一种方法可以达到类似的效果吗?

我有一个例子,大致要求我用quote和夜间Rust

写这样的东西
quote!(
     struct Foo {
        bar: [SomeTrait;#len]
     }
)

我需要确保SomeTrait在范围内(#len引用了一个超出代码段范围的整数)。

我在夜间使用过程宏和使用引用和同步,因为proc-macro-hack对我不起作用。 This is the example我正试图概括。

3 个答案:

答案 0 :(得分:4)

根据https://github.com/rust-lang/rust/issues/38356#issuecomment-412920528的回复,似乎没有办法(截至2018-08年)做到这一点,既没有明确引用proc宏板条箱,也没有明确引用任何其他板条箱。 / p>

答案 1 :(得分:1)

在2015版(经典的Rust)中,您可以执行此操作(但它很hacky):

  • 在宏中使用::defining_crate::SomeTrait
  • 在取决于defining_crate的第三方包装箱内,上述方法可以正常工作
  • defining_crate本身中,在根目录中添加一个模块:

    mod defining_crate { pub use super::*; }

在2018版中,甚至需要更多骇人听闻的解决方案(请参见this issue),尽管#55275可以为我们提供一种简单的解决方法。

答案 2 :(得分:1)

从Rust 1.34开始,您可以使用extern my_crate as self,然后使用my_crate::Foo代替$crate::Foo

https://github.com/rust-lang/rust/issues/54647

https://github.com/rust-lang/rust/pull/57407

(信用:Neptunepink ## rust irc.freenode.net)