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