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!();
この戦略を使用する場合、マクロは常にクレートの最上位にあることに注意してください。foo
が mod 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、外部アイテム、タイプ、およびパターンは、マクロを介して展開できます。