Verwenden Macro Across Module Files in React
In diesem Artikel lernen wir die Verwendung von Makros über Moduldateien hinweg in Rust kennen.
Rust-Makros
Rust bietet großartige Makrounterstützung. Beispielsweise beinhaltet die Metaprogrammierung, die durch Makros ermöglicht wird, das Schreiben von Code, der anderen Code schreibt.
Makros
bieten mit Funktionen vergleichbare Fähigkeiten, jedoch ohne die damit verbundenen Laufzeitkosten. Da Makros
zur Kompilierzeit erweitert werden, sind Bauzeitkosten damit verbunden.
Rust-Makros unterscheiden sich erheblich von C-Makros. Beispielsweise werden Rust-Makros auf den Token-Baum angewendet, während C-Makros Text ersetzen.
Syntaxen:
*MacroRulesDefinition* :
`macro_rules` `!` [IDENTIFIER] *MacroRulesDef*
MacroRules :
MacroRule ( ; MacroRule )* ;?
MacroRule :
MacroMatcher => MacroTranscriber
Makros über Kisten in Rust
Ein crate
enthält eine Hierarchie von Modulbereichen. Jedes Objekt innerhalb eines Kraters hat einen kanonischen Modulpfad, der seine Position innerhalb des Modulbaums angibt.
Auf der obersten Ebene dieses Baums befindet sich ein anonymes Modul. Eine Rust-Quelldatei spezifiziert ein Modul, dessen Name und Ort im Modulbaum der aktuellen Crate extern definiert werden: entweder durch ein explizites Module
-Element in einer referenzierten Quelldatei.
Es könnte auch der Name der Kisten selbst sein. Jede Quelldatei ist ein Modul.
Allerdings benötigt nicht jedes Modul seine Quelldatei: Moduldefinitionen können innerhalb einer einzigen Quelldatei geschichtet werden.
Kiste util
:
#[macro_export]
macro_rules! foo {
() => ()
}
Kiste Benutzer
:
use util::foo;
foo!();
Beachten Sie, dass sich Makros bei dieser Strategie immer auf der obersten Ebene einer Kiste befinden. Auch wenn foo
in einer mod bar
enthalten ist, muss die user
-Crate immer noch use util::foo;
schreiben. und nicht use util::bar::foo;
.
Sie können ein Makro aus einem Modul Ihrer Crate exportieren, indem Sie pub use
verwenden.
Makros in derselben Crate in Rust
foo::bar!();
mod foo {
macro_rules! bar {
() => ()
}
pub(crate) use bar;
}
foo::bar!();
Das Makro kann wie jedes andere Objekt mit pub use
importiert und verwendet werden. Und im Gegensatz zur älteren Methode hängt dies nicht von der Reihenfolge des Quellcodes ab, sodass Sie das Makro verwenden können, bevor es geschrieben wurde.
Jedes Makro
hat einen Namen und eine oder mehrere Regeln
. Jede Regel besteht aus zwei Teilen: einem Matcher, der die übereinstimmende Syntax beschreibt, und einem Transcriber, der die Syntax beschreibt, die einen erfolgreich übereinstimmenden Aufruf ersetzt.
Trennzeichen müssen sowohl den Matcher als auch den Transcriber umfassen. Ausdrücke, Statements, Traits, Impls, Foreign Items, Types und Patterns können über Makros erweitert werden.