[英]How do you refer to functions in a crate from an exported crate macro in rust?
我正在嘗試編寫一些調試助手宏。 因此,我創建了一個箱子來容納所有箱子,並使用phase(plugin)從外部引用該箱子:
#[cfg(test)]
#[phase(plugin)]
extern crate debugging;
成功將宏導出到板條箱中。
但是,對於某些工具,我想從包裝箱中調用函數,例如:
#[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());
}
};
)
使用全局名稱空間,即。 如果將宏放置到macros.rs中並從板條箱的板條根導入,則:: macros :: logger可以工作。
但是,當宏必須從其自己的板條箱調用調用時,我要在此處實現的目標是相同的。
如果宏正確擴展,我相信:
let s = ::crate_name::logger();
可能是這樣做的方法,但是帶有宏的板條箱無法以這種方式按名稱引用自身。 它產生如下錯誤:
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
}
那么,是否有某種方法可以從宏執行此操作?
現在,正確的做法是使用類似的絕對路徑,然后在原始板條箱中進行一些重新導出,以便解析路徑。
即lib.rs
放
mod debugging {
pub use logger;
}
它將頂級功能logger
為debugging::logger
。 正在做的工作使這種情況更聰明,例如$crate
擴展為宏所來自的板條箱的名稱(當在外部使用時),或者擴展為零(在內部使用時); 這不一定是最終設計,但正在改進。
對於任何其他發現此問題的人,值得注意的是,您不能在標有相位插件的板條箱中使用。 要在本地導入符號(按照公認的答案),您需要執行以下操作:
#[cfg(test)]
mod debug {
#[phase(plugin)]
extern crate debugging;
extern crate debugging;
pub use self::debugging::debug;
}
注意雙外部箱的調試,因為通常您不希望將語法擴展模塊作為代碼的一部分導出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.