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}");
}
Erklärung anzeigen

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?

Erklärung anzeigen

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?

Erklärung anzeigen

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.