簡體   English   中英

如何從rust中導出的板條箱宏引用板條箱中的函數?

[英]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;
}

它將頂級功能loggerdebugging::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM