如何引用rust中导出的板条箱宏中板条箱中的函数?

如何引用rust中导出的板条箱宏中板条箱中的函数?,rust,Rust,我正在尝试编写一些调试助手宏。因此,我创建了一个板条箱来容纳所有这些组件,并使用phase(插件)对外引用板条箱: 成功将宏导出到板条箱中 但是,对于其中一些工具,我希望从板条箱中调用函数,例如: #[macro_export] macro_rules! trace( {$($arg:tt)*} => { { extern crate debug; let s = ::macros::logger(); // <---- This! l

我正在尝试编写一些调试助手宏。因此,我创建了一个板条箱来容纳所有这些组件,并使用phase(插件)对外引用板条箱:

成功将宏导出到板条箱中

但是,对于其中一些工具,我希望从板条箱中调用函数,例如:

#[macro_export]
macro_rules! trace(
  {$($arg:tt)*} => {
    {
      extern crate debug;
      let s = ::macros::logger(); // <---- This!
      let _ = s.write_line(format_args!(::std::fmt::format, $($arg)*).as_slice());
    }
  };
)
将是这样做的方式,但是带有宏的板条箱不能以这种方式通过名称来引用自己。它会产生如下错误:

src/macros.rs:52:15: 52:20 error: failed to resolve. Maybe a missing `extern crate debugging`?
src/macros.rs:52       let s = ::debugging::logger();
                               ^~~~~
src/macros.rs:49:1: 56:2 note: in expansion of trace!
src/file.rs:26:11: 26:29 note: expansion site
…最后,为了让我们完全清楚我想做什么:

crate debugging:
   lib.rs
     fn logger() 
   macros.rs
     macro_rules! trace(...) // <--- Trying to figure out what to put here...

crate foo:
   lib.rs
     #[phase(plugin)] extern crate debugging;
     fn test_thing() {
       trace!("{}", ...); // <--- So debugging::logger() is invoked here
     } 
板条箱调试:
图书馆
fn记录器()
宏

宏规则!trace(…)/现在,正确的做法是使用这样的绝对路径,然后在原始板条箱中进行一些重新导出,以便路径解析

即在
lib.rs
put中

mod debugging {
    pub use logger;
}

它将顶级函数
记录器
重新导出为
调试::记录器
。正在进行的工作使这一点更加合理,例如,
$crater
,它扩展为宏来自的板条箱的名称(当外部使用时),或扩展为空(当内部使用时);这不一定是最终设计,但它正在改进。

对于其他任何发现这一点的人,值得注意的是,您不能从标有phase plugin的板条箱中使用。要在本地导入符号(根据接受的答案),您需要执行以下操作:

#[cfg(test)]
mod debug {
  #[phase(plugin)]
  extern crate debugging;
  extern crate debugging;
  pub use self::debugging::debug;
}
请注意双外部板条箱调试,因为通常您不希望将语法扩展模块作为代码的一部分导出

mod debugging {
    pub use logger;
}
#[cfg(test)]
mod debug {
  #[phase(plugin)]
  extern crate debugging;
  extern crate debugging;
  pub use self::debugging::debug;
}