Deklarative Makros (`macro_rules!`)
Lernen Sie, deklarative Makros zu schreiben, um sich wiederholende Codemuster zu abstrahieren und zur Compile-Zeit Code zu erzeugen.
Deklarative Makros (`macro_rules!`) ist eine kostenlose Learn Rust Coding-Lektion auf CoddyKit. Dies ist Lektion 1 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Learn Rust Coding-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Learn Rust Coding-Kurs umfasst insgesamt 3 Lektionen.
Was sind Rust-Makros?
Makros bieten eine Möglichkeit, Code zu schreiben, der Code schreibt! Sie ähneln Funktionen, arbeiten aber nicht mit Werten, sondern mit Syntaxbäumen (der Struktur Ihres Codes).
- Sie helfen dabei, sich wiederholenden Code zu abstrahieren.
- Sie ermöglichen domänenspezifische Sprachen (DSLs) innerhalb von Rust.
- Sie werden zur Compile-Zeit ausgeführt und vor der Kompilierung in normalen Rust-Code erweitert.
Syntax deklarativer Makros
Rusts deklarative Makros verwenden das Schlüsselwort macro_rules!. Sie definieren eine Reihe von Regeln, die bestimmten Mustern von Rust-Code entsprechen.
Stellen Sie es sich als Pattern Matching für Codeausschnitte vor. Wenn der Compiler einen Makroaufruf sieht, versucht er, die Eingabe einer der von Ihnen definierten Regeln zuzuordnen.
Ihr erstes `macro_rules!`
Erstellen wir ein sehr einfaches Makro, das eine Begrüßung ausgibt. Beachten Sie das Schlüsselwort macro_rules! und die Syntax () => {}, mit der eine Regel ohne Eingabemuster definiert wird.
Führen Sie dieses Beispiel aus:
macro_rules! greet {
() => {
println!("Hello from a macro!");
};
}
fn main() {
greet!(); // Call our macro!
}Eingaben mit Designatoren erfassen
Makros können Eingaben mithilfe von „Designatoren“ entgegennehmen. Diese geben dem Makro an, welche Art von Rust-Syntax es erfassen soll.
$expr: Ein Ausdruck (z. B.1 + 2,"hello")$ident: Ein Bezeichner (z. B. ein Variablen- oder Funktionsname)$ty: Ein Typ (z. B.i32,String)$block: Ein Codeblock (z. B.{ ... })- ...und viele weitere!
Makros mit Argumenten
Hier ist ein Makro, das einen Ausdruck ($e:expr) entgegennimmt und dessen Wert ausgibt. Das :expr ist der Designator.
Das erfasste $e kann anschließend im Rumpf des Makros verwendet werden. Das Makro stringify! wandelt den Ausdruck in seine String-Darstellung um.
macro_rules! debug_print {
($e:expr) => {
println!("Debug: {} = {:?}", stringify!($e), $e);
};
}
fn main() {
let x = 10;
debug_print!(x + 5);
debug_print!("Rust macros are fun");
}Mehrere Eingaben verarbeiten
Was ist, wenn Sie ein Makro erstellen möchten, das mehrere Argumente desselben Typs akzeptiert? Sie können Wiederholungsoperatoren verwenden: $()*.
$(): Der Inhalt darin ist das zu wiederholende Muster.*: Null oder mehr Wiederholungen.+: Eine oder mehr Wiederholungen.- Sie können auch ein Trennzeichen angeben, beispielsweise
$(...),*für durch Kommas getrennte Elemente.
Makro mit wiederholten Argumenten
Erstellen wir ein Makro, das mehrere durch Kommas getrennte Ausdrücke akzeptiert und jeden einzelnen ausgibt. Dies ist besonders nützlich, um listenähnliche Strukturen zu erstellen.
macro_rules! print_all {
( $( $x:expr ),* ) => {
$( // This $(...)* repeats the `println!` call
println!("Item: {:?}", $x);
)*
};
}
fn main() {
print_all!(1, "hello", true, 3.14);
print_all!("Just one item");
}Makro-Hygiene verstehen
Die Makros von Rust sind „hygienisch“. Das bedeutet, dass innerhalb eines Makros definierte Variablen nicht versehentlich mit Variablen außerhalb des Makros kollidieren, selbst wenn sie denselben Namen haben.
Der Compiler benennt Elemente während der Expansion intern um, um unbeabsichtigte Seiteneffekte zu verhindern. Dadurch lassen sich Makros sicherer und vorhersehbarer verwenden.
Makros debuggen
Manchmal werden Makros nicht so expandiert, wie Sie es erwarten. Rust bietet eine Möglichkeit, den expandierten Code anzuzeigen:
- Führen Sie
cargo expandaus (dazu muss das Toolcargo-expandinstalliert sein). - Verwenden Sie
rustc --pretty expandeddirekt für Ihre Quelldatei.
Dadurch wird der unverarbeitete Rust-Code angezeigt, den Ihr Makro erzeugt. Das ist für das Debuggen und das Verständnis komplexen Makroverhaltens äußerst hilfreich!
Quiz zum Pattern-Matching bei Makros
Betrachten Sie die folgende Makrodefinition:
macro_rules! make_tuple {
( $x:expr, $y:expr ) => {
($x, $y)
};
}Welche der folgenden Zeilen würde erfolgreich kompiliert und das Makro make_tuple! verwenden?
Zusammenfassung: Deklarative Makros
In dieser Lektion haben Sie deklarative Makros mit macro_rules! kennengelernt:
- Sie erzeugen zur Kompilierzeit Code und abstrahieren sich wiederholende Muster.
- Sie verwenden Pattern-Matching, um Eingaben anhand ihrer Syntax zu erfassen.
- Designatoren wie
$exprund$identlegen fest, welche Art von Syntax erwartet wird. - Wiederholungsoperatoren wie
$()*verarbeiten mehrere Argumente mit flexiblen Trennzeichen. - Makros sind hygienisch und verhindern versehentliche Namenskonflikte.
Makros sind ein leistungsfähiges Werkzeug, um Boilerplate-Code zu reduzieren und flexible, ergonomische APIs in Rust zu erstellen!
Häufig gestellte Fragen
Ist die Lektion „Deklarative Makros (`macro_rules!`)“ kostenlos?
Ja — der vollständige Text von „Deklarative Makros (`macro_rules!`)“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Learn Rust Coding-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Learn Rust Coding-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Deklarative Makros (`macro_rules!`)“?
Lernen Sie, deklarative Makros zu schreiben, um sich wiederholende Codemuster zu abstrahieren und zur Compile-Zeit Code zu erzeugen. Du übst Learn Rust Coding mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Learn Rust Coding zu starten?
Keine Vorkenntnisse erforderlich. Learn Rust Coding auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 3.
Wie lange dauert die Lektion „Deklarative Makros (`macro_rules!`)“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Learn Rust Coding-Lektion Code schreiben und ausführen?
Ja. Jede Learn Rust Coding-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Deklarative Makros (`macro_rules!`)
- Prozedurale Makros: Derive, Function
- Mit Unsafe Rust arbeiten