Was verbirgt sich hinter dem geheimnisvollen r#""# in Rust? Vollständige Erklärung mit Code
Haben Sie jemals in Rust-Code eine seltsame Schreibweise wie r#"..."# gesehen und gedacht: „Was für ein magischer Operator? Ist das eine geheime Syntax für Eingeweihte?“ – damit sind Sie nicht allein. Tausende Entwickler haben diese Frage auf Stack Overflow gestellt, und heute klären wir ein für alle Mal, was das ist, wozu es dient und wie man Raw-String-Literale in Rust verwendet.
In diesem Artikel geben wir nicht nur eine trockene Definition. Wir gehen den Weg vom Problem zur Lösung, schreiben echten Code, sehen, wie r#""# vor Kopfschmerzen bewahrt, und erfahren, wo diese Syntax sonst noch angewendet wird. Los geht's!
Das Problem: Wenn normale Strings den Code zerstören
Stellen Sie sich vor, Sie schreiben einen JSON-Parser oder einen regulären Ausdruck. Innerhalb des Strings müssen Sie Anführungszeichen und Backslashes verwenden. In normalem Rust-Code sieht das wie ein Albtraum aus:
let json_string = "{\\"name\\": \\"Rust\\", \\"year\\": 2015}";let regex = "\\\\d{2}-\\\\d{2}-\\\\d{4}"; // Datum im Format DD-MM-YYYYSehen Sie sich das an? Jedes Mal, wenn Sie ein Anführungszeichen innerhalb eines Strings benötigen, setzen Sie einen Backslash davor (\\"). Und wenn Sie selbst einen Backslash benötigen, schreiben Sie \\\\. Der Code verwandelt sich schnell in eine „Leiter“ aus Backslashes, die schwer zu lesen und zu debuggen ist.
Aber das ist noch nicht alles. Was ist, wenn Sie ein Tabulatorzeichen in einen String einfügen müssen? Dann schreiben Sie \\t. Und wenn Sie buchstäblich den Text \\t benötigen? Dann müssen Sie escapen: \\\\t. Die Augen beginnen bereits in der zweiten Zeile zu schmerzen.
Die Lösung: Raw Strings – r#""#
Rust bietet einen eleganten Ausweg – Raw-String-Literale. Sie werden mit dem Präfix r gekennzeichnet und in # eingeschlossen:
// Raw String: Alles darin wird als buchstäblicher Text betrachtetlet raw_json = r#"{"name": "Rust", "year": 2015}"#;let raw_regex = r#"\\d{2}-\\d{2}-\\d{4}"#;Spüren Sie den Unterschied? Kein Escaping! Anführungszeichen darin sind einfach Anführungszeichen. Backslashes sind einfach Backslashes. Der Rust-Compiler betrachtet den Inhalt zwischen r#" und "# als reinen Text, ohne zu versuchen, Escape-Sequenzen zu interpretieren.
Dies ist besonders nützlich, wenn Sie mit Folgendem arbeiten:
- Regulären Ausdrücken – sie sind voller Backslashes und Sonderzeichen.
- JSON, XML, HTML – Strings mit vielen Anführungszeichen.
- SQL-Abfragen – insbesondere mit verschachtelten Anführungszeichen.
- Dateipfaden unter Windows –
C:\\Users\\NamestattC:\\\\Users\\\\Name. - Beliebigen Daten, bei denen der Backslash so bleiben muss, wie er ist.
Wie funktioniert das unter der Haube?
Wenn Rust auf r#"..."# trifft, kopiert es einfach alles, was zwischen dem öffnenden r#" und dem schließenden "# steht, in den String, ohne jegliche Verarbeitung. Kein wird in einen Zeilenumbruch umgewandelt, kein \\t wird zu einem Tabulator. Es ist ein buchstäblicher Textausschnitt.
Es gibt jedoch eine Nuance: Was tun, wenn innerhalb des Strings selbst die Sequenz "# vorkommt? Wenn Sie zum Beispiel den Text #"hello"# einfügen möchten. Wenn Sie r#"#"hello"#"# schreiben, wird der Compiler verwirrt – wo endet das Literal?
Dafür hat Rust mehrere Hashes erfunden. Sie können r##"..."##, r###"..."### und so weiter verwenden. Die Anzahl der # auf beiden Seiten muss übereinstimmen:
// Der String enthält "# im Inneren – wir verwenden doppelte Hasheslet tricky = r##"String mit "# im Inneren"##;println!("{}", tricky); // Gibt aus: String mit "# im Inneren
// Und wenn "#" im Inneren ist? Dann dreifache Hashes:let very_tricky = r###"Text mit "## im Inneren"###;