2015-04-07 10 views
33

Es fällt mir schwer herauszufinden, wie die Stringsyntax in Rust funktioniert. Insbesondere versuche ich herauszufinden, wie man eine mehrzeilige Zeichenkette erstellt.Wie lautet die Syntax für ein mehrzeiliges Zeichenfolgenliteral?

+1

Mögliches Duplikat von [Wie schreibe ich eine mehrzeilige Zeichenfolge in Rust?] (Http://stackoverflow.com/questions/15265198/how-do-i-write-a-multi-line-string-in -rust) –

Antwort

52

Alle Zeichenfolgenliterale können über mehrere Zeilen verteilt sein, z.

let string = "line one 
line two"; 

ist eine zweizeilige Zeichenfolge, die gleiche wie "line one\nline two" (natürlich kann man die \n direkt zu entkommen Newline verwenden). Wenn Sie eine Zeichenkette aus Formatierungsgründen nur über mehrere Zeilen aufteilen möchten, können Sie die Zeilenumbrüche und die führenden Leerzeichen mit einer \, z.

let string = "one line \ 
    written over \ 
    several"; 

ist das gleiche wie "one line written over several".

+0

Danke! Ich suchte nach dem Fall "line one/nline two". – Dumbapples

20

Falls Sie wollen etwas länger, etwas zu tun, was zitiert, Schrägstriche, usw. können oder nicht enthalten, die Verwendung raw string literal notation:

let shader = r#" 
    #version 330 

    in vec4 v_color; 
    out vec4 color; 

    void main() { 
     color = v_color; 
    }; 
"#; 

Wenn Sie Sequenzen von doppelten Anführungszeichen und Hash-Symbole innerhalb

let crazy_raw_string = r###" 
    My fingers #" 
    can#"#t stop "#"" hitting 
    hash##"# 
"###; 
+0

Aber ... Sie müssen nur Zeilenumbrüche umgehen, wenn Sie keine Zeilenumbrüche im Ergebnis haben wollen, und rohe Strings helfen dabei nicht. – poolie

+0

Raw-Zeichenfolgen verhindern nur, dass Sie am Ende jeder Zeile ein '\' hinzufügen müssen, wenn Sie die Zeilenumbrüche nicht berücksichtigen (z. B. beim Einbetten von Code, der unabhängig von Shadern und Kerneln ist) oder wie Sie angespielt, wenn die Zeilenumbrüche tatsächlich notwendig sind. Es erleichtert nur das Einbetten von Code, den Sie bearbeiten möchten, und muss sich nicht mit dem "\" am Ende jeder Zeile herumärgern. Das ist alles. – c0g

+0

Wenn Sie in der resultierenden Zeichenkette Zeilenumbrüche verwenden möchten (oder nicht daran interessiert sind), werden einfache doppelt zitierte Strings sehr gut funktionieren, wie in den anderen Beispielen gezeigt. Wenn Sie Zeilenumbrüche vermeiden möchten, sind rohe Strings nicht gut.Sie helfen nur, wenn der Text Anführungszeichen, Backslashes usw. enthält - wie es bei eingebetteter Quelle der Fall ist. – poolie

19

Huon's answer korrekt ist, aber wenn die Einbuchtung Sie stört, sollten Sie Indoc verwendet, die eine prozedurale Makro für gegliederte mu: Zeichenfolge, können Sie eine beliebige Anzahl von Hashes als Trennzeichen bezeichnen ll-Linien-Saiten. Es steht für "eingerücktes Dokument". Es stellt ein Makro mit dem Namen indoc!() bereit, das ein mehrzeiliges Zeichenfolgenliteral verwendet und es rückgängig macht, so dass das linke Leerzeichen ohne Leerzeichen in der ersten Spalte steht.

let s = indoc!(" 
      line one 
      line two"); 

Das Ergebnis ist "line one\nline two".

Es gibt ein paar gleichwertige Möglichkeiten, die gleiche Sache zu formatieren, wenn Sie bevorzugen, also wählen Sie eine, die Sie mögen. Die folgenden beiden ergeben dieselbe Zeichenfolge wie oben. Der Inhalt kann so oft eingerückt werden, wie Sie möchten - es muss keine bestimmte Anzahl von Leerzeichen sein.

let s = indoc!(
     "line one 
      line two"); 

let s = indoc!("line one 
       line two"); 

Leerraum ist in Bezug auf die am weitesten links liegenden Nicht-Leerzeichen in dem Dokument erhalten, so dass die folgende Zeile weist zwei eingekerbte 3 Felder relativ zu einer Zeile:

let s = indoc!(" 
      line one 
      line two"); 

Das Ergebnis ist "line one\n line two".

Verwandte Themen