React でモジュールファイル全体でマクロを使用する

Nilesh Katuwal 2023年1月30日
  1. Rust マクロ
  2. Rust で木枠を横切るマクロ
  3. Rust の同じクレート内のマクロ
React でモジュールファイル全体でマクロを使用する

この記事では、Rust のモジュールファイル間でマクロを使用する方法について学習します。

Rust マクロ

Rust は優れたマクロサポートを提供します。たとえば、マクロを介して有効化されるメタプログラミングには、他のコードを書き込むコードの記述が含まれます。

Macros は、機能に匹敵する機能を提供しますが、関連するランタイムコストはありません。マクロはコンパイル時に拡張されるため、ビルド時間のコストが伴います。

Rust マクロは C マクロとは大きく異なります。たとえば、Rust マクロはトークンツリーに適用されますが、C マ​​クロはテキストを置き換えます。

構文:

*MacroRulesDefinition* :
  `macro_rules` `!` [IDENTIFIER] *MacroRulesDef*
MacroRules :
   MacroRule ( ; MacroRule )* ;?

MacroRule :
   MacroMatcher => MacroTranscriber

Rust で木枠を横切るマクロ

クレートには、モジュールスコープの階層が含まれます。クレート内のオブジェクトには、モジュールツリー内の場所を示す正規のモジュールパスがあります。

このツリーの最上位には、匿名モジュールがあります。Rust ソースファイルは、現在のクレートのモジュールツリー内の名前と場所が外部で定義されているモジュールを指定します。参照されているソースファイル内の明示的なモジュールアイテムによって定義されます。

木枠自体の名前でもあります。すべてのソースファイルはモジュールです。

ただし、すべてのモジュールにソースファイルが必要なわけではありません。モジュール定義は単一のソースファイル内に階層化できます。

クレート util

#[macro_export]
macro_rules! foo {
    () => ()
}

クレートユーザー

use util::foo;

foo!();

この戦略を使用する場合、マクロは常にクレートの最上位にあることに注意してください。foomod bar 内に含まれている場合でも、user クレートは use util::foo; と書き込む必要があります。use util::bar::foo; ではありません。

pub use を使用して、クレートのモジュールからマクロをエクスポートできます。

Rust の同じクレート内のマクロ

foo::bar!();

mod foo {
    macro_rules! bar {
        () => ()
    }

    pub(crate) use bar;
}

foo::bar!();

マクロをインポートして、pub use を使用して他のオブジェクトとして使用できます。また、以前の方法とは異なり、これはソースコードの順序に依存しないため、マクロを作成する前に使用できます。

マクロには、名前と 1つ以上のルールがあります。各ルールは 2つの部分で構成されています。1つは一致する構文を説明するマッチャー、もう 1つは正常に一致した呼び出しの代わりとなる構文を説明するトランスクライバーです。

区切り文字は、マッチャーとトランスクライバーの両方を含む必要があります。式、ステートメント、特性、impl、外部アイテム、タイプ、およびパターンは、マクロを介して展開できます。