Qual è la sintassi per una stringa multilinea letterale?


Risposte:


173

Tutti i letterali stringa possono essere suddivisi su più righe; per esempio:

let string = "line one
line two";

è una stringa di due righe, la stessa di "line one\nline two"(ovviamente si può usare \ndirettamente anche la escape newline). Se desideri semplicemente spezzare una stringa su più righe per motivi di formattazione, puoi sfuggire alla nuova riga e allo spazio bianco iniziale con un \; per esempio:

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

è lo stesso di "one line written over several".

Se vuoi delle interruzioni di riga nella stringa, puoi aggiungerle prima di \:

let string = "multiple\n\
              lines\n\
              with\n\
              indentation";

È lo stesso di "multiple\nlines\nwith\nindentation";


2
Se il problema è solo la leggibilità, vorrei aggiungere la concat!()macro per completare le opzioni fornite ( doc.rust-lang.org/std/macro.concat.html )
hakononakani,

82

Se vuoi fare qualcosa di più lungo, che può includere o meno virgolette, barre rovesciate, ecc., Usa la notazione letterale stringa grezza :

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

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

Se nella sequenza sono presenti sequenze di virgolette doppie e simboli di hash, è possibile indicare un numero arbitrario di hash come delimitatore:

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

Ma ... devi solo sfuggire alle nuove linee se non vuoi nuove linee nel risultato e le stringhe grezze non ti aiutano.
Poolie,

Le stringhe non elaborate ti impediscono semplicemente di aggiungere un '\' alla fine di ogni riga se non ti interessano le newline (come quando stai incorporando un codice che è agnostico come newline come shader e kernel) o, come hai alluso a, quando le nuove linee sono effettivamente necessarie. Semplifica semplicemente l'incorporamento del codice che potresti voler modificare e non doverti preoccupare con "\" alla fine di ogni riga. È tutto.
C0G

1
Se vuoi (o non ti dispiace) newline nella stringa risultante, le semplici stringhe tra virgolette andranno benissimo, come mostrato negli altri esempi. Se vuoi evitare newline, le stringhe grezze non vanno bene. Aiutano davvero solo se il testo include virgolette, barre rovesciate, ecc., Come può accadere nella fonte incorporata.
Poolie,

2
Vedo cosa stai ottenendo ora e hai perfettamente ragione.
c0g

1
Aiuterebbe a mostrare l'output della stampa di queste stringhe. Dalla risposta stessa non posso dire cosa accadrà con le nuove righe e come verrà gestita la rientranza.
bluenote10,

48

La risposta di Huon è corretta, ma se il rientro ti disturba, considera l'utilizzo di Indoc, che è una macro procedurale per le stringhe multilinea rientrate. Sta per "documento rientrato". Fornisce una macro chiamata indoc!()che prende letteralmente una stringa multilinea e non lo rientra, quindi il carattere non spaziale più a sinistra si trova nella prima colonna.

let s = indoc! {"
    line one
    line two
"};

Il risultato è "line one\nline two\n".

Lo spazio bianco viene conservato rispetto al carattere non spaziale più a sinistra nel documento, quindi i seguenti spazi della riga due rientrano 3 rispetto alla riga uno:

let s = indoc! {"
    line one
       line two
"};

Il risultato è "line one\n line two\n".


8

Nel caso in cui desideri rientrare il testo in più righe nel tuo codice:

let s = "first line\n\
    second line\n\
    third line";

println!("Multiline text goes next:\n{}", s);

Il risultato sarà il seguente:

Multiline text goes next:
first line
second line
third line

Si prega di indicare esplicitamente , usando la prosa, quale parte del codice è importante per questo comportamento.
Shepmaster

In questo momento, questo sembra non aggiungere nulla di nuovo alla risposta accettata , che afferma: si può usare la \nfuga di newline [...] è possibile sfuggire alla newline e condurre lo spazio bianco con a{backslash} . (sembra molto difficile digitare una barra rovesciata nel codice in un commento, a quanto pare.)
Shepmaster

2
Questo commento suggerisce un modo per combinare i due punti nella risposta accettata: come è possibile produrre una stringa a più righe, scritta come righe multiple nel codice, ma che allo stesso tempo è consentita, per motivi stilistici o di leggibilità, di ottenere il proprio rientro nel codice, senza questo rientro che termina nella stringa finale. Non è molto chiaro nel testo, ma è un caso d'uso comune e quindi un prezioso suggerimento imho. (Vedi la risposta di dtolnay per la versione cassa di questo.)
Dato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.