在 Rust 各個模組檔案中使用巨集程式

Nilesh Katuwal 2023年1月30日 2022年7月18日
  1. Rust 巨集
  2. Rust 中跨箱子的巨集
  3. Rust 中同一個 Crate 中的巨集
在 Rust 各個模組檔案中使用巨集程式

在本文中,我們將學習如何在 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 匯入並用作任何其他物件。與舊方法不同,這不依賴於原始碼順序,因此你可以在巨集編寫之前使用它。

每個巨集都有一個名稱和一個或多個規則。每個規則由兩部分組成:一個匹配器,它描述它匹配的語法,一個轉錄器,它描述將被成功匹配的呼叫替換的語法。

分隔符必須包含匹配器和轉錄器。表示式、語句、特徵、實現、外來項、型別和模式可以通過巨集進行擴充套件。