Einleitung: Warum mag Rust keine geschweiften Klammern?
\n\nWenn Sie jemals in Rust programmiert und versucht haben, etwas wie { "name": "Rust" } mit println! auszugeben, haben Sie sicherlich Folgendes gesehen:
println!("{ "name": "Rust" }"); // Kompilierungsfehler!\n\nDer Compiler meldet schadenfroh: "invalid reference to argument 'name' — no argument named 'name' found". Und Sie stehen ratlos da: Wie gibt man geschweifte Klammern in einem String aus? In Python macht man das mit {{ }}, aber dort ist alles einfacher. Rust hat seine eigene Philosophie: Geschweifte Klammern sind nicht nur Symbole, sondern Teil eines mächtigen Formatierungssystems, das von Python übernommen wurde, jedoch mit Nuancen.
In diesem Artikel behandeln wir alle Methoden zur Maskierung geschweifter Klammern in Rust: von der grundlegenden {{ }}-Methode bis hin zu Tricks mit Debug und raw string literals. Sie erfahren, wie Sie JSON ausgeben, Code generieren und mit Vorlagen arbeiten, ohne in die Fallstricke des Compilers zu geraten.
Warum sind geschweifte Klammern besonders?
\n\nIn Rust verwenden die Makros format!, println!, write! und format_args! geschweifte Klammern als Platzhalter-Markierungen. Zum Beispiel:
let name = "Rust";\nprintln!("Hallo, {}!", name); // Hallo, Rust!\n\nHier ist {} ein Platzhalter, der durch den Wert der Variablen ersetzt wird. Aber was ist, wenn Sie das Zeichen { oder } selbst benötigen? Rust verwendet einen einfachen Trick: Verdopplung der Klammern.
Methode 1: Klassische Verdopplung mit {{ und }}
\n\nDer einfachste und offensichtlichste Weg ist, zwei geschweifte Klammern hintereinander zu schreiben. Das erste Paar {{ wird zu einer einzelnen {, und }} wird zu einer einzelnen }.
Beispiel 1: Einfache Maskierung
\nfn main() {\n let text = format!("Funktion main() {{ ... }}");\n println!("{}", text);\n // Ausgabe: Funktion main() { ... }\n}\n\nBeispiel 2: Maskierung mit Platzhaltern
\nfn main() {\n let lang = "Rust";\n let year = 2015;\n let result = format!("{{ \\"lang\\": \\"{}\\", \\"year\\": {} }}", lang, year);\n println!("{}", result);\n // Ausgabe: { "lang": "Rust", "year": 2015 }\n}\n\nDiese Methode funktioniert überall: in println!, write!, format!. Merken Sie sich die Regel: zwei Klammern = eine Klammer.
Methode 2: Benannte Argumente und Maskierung
\n\nWenn Sie benannte Argumente verwenden (z. B. {name}), funktioniert die Maskierung ebenfalls, aber Sie müssen auf die Position der Klammern achten.
Beispiel 3: Benannte Platzhalter und Klammern
\nfn main() {\n let user = "Alice";\n // Wir möchten ausgeben: Hallo, {Alice}!\n println!("Hallo, {{{}}}!", user);\n // Ausgabe: Hallo, {Alice}!\n}\n\nAnalysieren wir den String "Hallo, {{{}}}!":\n
- \n
{{→ gibt{aus \n {}→ setztuserein \n }}→ gibt}aus \n
Wichtig: Die Anzahl der Klammern ist für die Maskierung immer gerade. Wenn Sie {{{ haben, ist das ein Fehler, da drei Klammern kein korrektes Paar bilden.
Methode 3: Verwendung des Debug-Formats ({:?})
\n\nManchmal möchten Sie eine Datenstruktur so ausgeben, dass sie automatisch mit geschweiften Klammern dargestellt wird. Zum Beispiel beim Debuggen oder bei der JSON-Generierung.
\n\nBeispiel 4: Ausgabe einer Struktur mit Debug
\n#[derive(Debug)]\nstruct Point {\n x: i32,\n y: i32,\n}\n\nfn main() {\n let p = Point { x: 10, y: 20 };\n println!("{:?}", p);\n // Ausgabe: Point { x: 10, y: 20 }\n}\n\nDas Debug-Trait fügt selbst Klammern um die Felder hinzu. Das ist praktisch, wenn Sie schnell den Zustand eines Objekts anzeigen möchten. Aber wenn Sie genau JSON oder eine andere