Macros #
In Rust existieren zwei Typen von Macros:
- Declarative Macros (
macro_rules! ...) - Procedural Macros
- Derive macros (
#[derive(CustomDerive)]) - Function-like macros (
custom!(...)) - Attribute macros** (**
#CustomAttribute])
- Derive macros (
Declarative Macros #
Werden mit dem macro_rules!-Makro definiert:
macro_rules! test {
() => {}
}
Dieses Macro macht zwar noch gar nichts, doch zeigt es schon alle wichtigen Bestandteile eines deklarativen Makros:
macro_rules!- Name des Makros (hier
test) - Pattern matching in geschweiften Klammern, wobei
()der Matcher und{}der Transcriber ist
Der Matcher besteht üblicherweise aus zwei Teilen,
- einem Namen, der im Transcriber gebunden wird, und der immer mit
$anfangen muss, und, durch ein:getrennt, - ein Designator, welcher den Typ definiert, den es zu matchen gilt.
Designators #
| Type | Matches | Allowed suffixes |
|---|---|---|
| expr | Expression | => , ; |
| stmt | Expression / declaration, not including any trailing semicolon | => , ; |
| ty | Type | => , ; = | { [ : > as where |
| path | Path | => , ; = | { [ : > as where |
| pat | Pattern | => , = | if in |
| item | Item | Anything |
| block | Block | Anything |
| meta | Body of an attribute | Anything |
| ident | Identifier | Anything |
| tt | Token tree | Anything |
Procedural Macros #
Ressourcen #
“Offizielle” Ressourcen:
- Macros in “The Book”
- macro_rules! in Rust by Examples
- Macros in der Rust Reference
- Procedural Macros in der Rust Reference
- Macros im 2018 Edition Book
Sonstige: