Verwenden Macro Across Module Files in React

Nilesh Katuwal 30 Januar 2023
  1. Rust-Makros
  2. Makros über Kisten in Rust
  3. Makros in derselben Crate in Rust
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.