Zum Inhalt springen

Makros

macro_rules! manylet {
( $( $i:ident ),* = $e:expr ) => {
$(
let mut $i = $e;
)*
}
}
fn main() {
let mut s = String::from("A");
manylet!(x, y = s);
x.push_str("B");
println!("{x}{y}");
}

Das Makro manylet dupliziert syntaktisch den Ausdruck e als Bindung für jede Variable auf der linken Seite des Gleichheitszeichens. Da s jedoch ein String mit Ownership ist, verschiebt die erste Bindung an x den Wert von s , und die zweite Bindung an y ist daher ungültig.


Welche der folgenden Gründe sind gültig, um ein Makro als prozedurales Makro anstelle eines deklarativen Makros zu implementieren?

Prozedurale Makros sind die einzige Möglichkeit, ein benutzerdefiniertes Derive zu erstellen. Prozedurale Makros sind auch nützlich, wenn Sie Code benötigen, um die Syntax des Makro-Benutzers zu analysieren – deklarative Makros erlauben nur das Umordnen der Eingabe, nicht z.B. deren Größe zu berechnen.

Deklarative Makros können Code-Sequenzen variabler Länge generieren und können Elemente (nicht nur Ausdrücke) umschließen/produzieren.


Welche der folgenden Aussagen beschreibt am besten die Eingabe eines prozeduralen Makros?

Prozedurale Makros nehmen Token-Streams als Eingabe (und erzeugen sie als Ausgabe). Sie können Crates wie syn verwenden, um Tokens in Syntaxbäume umzuwandeln.