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: