在 Rust 各個模組檔案中使用巨集程式
Nilesh Katuwal
2023年1月30日
2022年7月18日
在本文中,我們將學習如何在 Rust 中跨模組檔案使用巨集。
Rust 巨集
Rust 提供了很好的巨集支援。例如,通過巨集啟用的超程式設計涉及編寫編寫其他程式碼的程式碼。
巨集
提供與函式相當的能力,但沒有相關的執行時成本。由於巨集
在編譯時擴充套件,因此構建時間成本是相關的。
Rust 巨集與 C 巨集有很大不同。例如,Rust 巨集應用於標記樹,而 C 巨集替換文字。
語法:
*MacroRulesDefinition* :
`macro_rules` `!` [IDENTIFIER] *MacroRulesDef*
MacroRules :
MacroRule ( ; MacroRule )* ;?
MacroRule :
MacroMatcher => MacroTranscriber
Rust 中跨箱子的巨集
crate
包括模組範圍的層次結構。crate 中的任何物件都有一個規範的模組路徑,指示其在模組樹中的位置。
在這個樹的頂層,有一個匿名模組。Rust 原始檔指定了一個模組,其名稱和在當前 crate 的模組樹中的位置是外部定義的:或者通過引用原始檔中的顯式 Module
項。
它也可能是板條箱本身的名稱。每個原始檔都是一個模組。
然而,並不是每個模組都需要它的原始檔:模組定義可以在單個原始檔中分層。
板條箱 util
:
#[macro_export]
macro_rules! foo {
() => ()
}
板條箱使用者
:
use util::foo;
foo!();
請注意,使用此策略時,巨集始終位於 crate 的頂層。即使 foo
包含在 mod bar
中,user
crate 仍然必須寫 use util::foo;
而不是使用 util::bar::foo;
。
你可以使用 pub use
從 crate 的模組中匯出巨集。
Rust 中同一個 Crate 中的巨集
foo::bar!();
mod foo {
macro_rules! bar {
() => ()
}
pub(crate) use bar;
}
foo::bar!();
巨集可以通過 pub use
匯入並用作任何其他物件。與舊方法不同,這不依賴於原始碼順序,因此你可以在巨集編寫之前使用它。
每個巨集
都有一個名稱和一個或多個規則
。每個規則由兩部分組成:一個匹配器,它描述它匹配的語法,一個轉錄器,它描述將被成功匹配的呼叫替換的語法。
分隔符必須包含匹配器和轉錄器。表示式、語句、特徵、實現、外來項、型別和模式可以通過巨集進行擴充套件。