Qual é a sintaxe para um literal de seqüência de caracteres de múltiplas linhas?

Respostas:

173

Todos os literais de string podem ser divididos em várias linhas; por exemplo:

let string = "line one
line two";

é uma sequência de duas linhas, a mesma que "line one\nline two"(é claro que também é possível usar a \nfuga de nova linha diretamente). Se você deseja apenas quebrar uma cadeia de caracteres em várias linhas por motivos de formatação, pode escapar da nova linha e do espaço em branco inicial com a \; por exemplo:

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

é o mesmo que "one line written over several".

Se você deseja quebras de linha na string, pode adicioná-las antes de \:

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

É o mesmo que "multiple\nlines\nwith\nindentation";

huon
fonte
2
Se apenas a legibilidade é o problema, eu gostaria de adicionar a concat!()macro para completar as opções dadas ( doc.rust-lang.org/std/macro.concat.html )
hakononakani
82

Caso você queira fazer algo um pouco mais, que pode ou não incluir aspas, barras invertidas, etc., use a notação literal de cadeia bruta :

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

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

Se você tiver seqüências de aspas duplas e símbolos de hash em sua sequência, poderá denotar um número arbitrário de hashes como um delimitador:

let crazy_raw_string = r###"
    My fingers #"
    can#"#t stop "#"" hitting
    hash##"#
"###;
c0g
fonte
Mas ... você só precisa escapar de novas linhas se não quiser novas linhas no resultado, e as strings brutas não ajudam nisso.
poolieby
Seqüências brutas apenas impedem que você adicione um '\' no final de cada linha, se você não se importa com as novas linhas (como quando você está incorporando código que é independente de nova linha, como shaders e kernels) ou, como você aludiu para, quando as novas linhas forem realmente necessárias. Isso facilita a incorporação de códigos que você pode querer editar e não precisa se preocupar com o '\' no final de cada linha. Isso é tudo.
C0g 07/07
1
Se você deseja (ou não se importa) novas linhas na sequência resultante, as seqüências simples de aspas duplas se sairão perfeitamente bem, conforme mostrado nos outros exemplos. Se você deseja evitar novas linhas, as cadeias brutas não são boas. Eles realmente ajudam apenas se o texto incluir aspas, barras invertidas, etc. - como pode acontecer na fonte incorporada.
poolie
2
Eu vejo o que você está recebendo agora e está absolutamente certo.
C0g
1
Ajudaria a mostrar o resultado da impressão dessas seqüências. Pela resposta em si, não sei dizer o que acontecerá com as novas linhas e como a indentação é tratada.
bluenote10 17/01
48

A resposta de Huon está correta, mas se o recuo o incomodar, considere usar o Indoc, que é uma macro processual para seqüências de caracteres de múltiplas linhas recuadas. Significa "documento recuado". Ele fornece uma macro chamada indoc!()que pega um literal de seqüência de caracteres de múltiplas linhas e o recorta, de modo que o caractere não-espaço mais à esquerda esteja na primeira coluna.

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

O resultado é "line one\nline two\n".

O espaço em branco é preservado em relação ao caractere não-espaço mais à esquerda no documento, portanto, a seguir, a linha dois recuou 3 espaços em relação à linha um:

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

O resultado é "line one\n line two\n".

dtolnay
fonte
8

Caso você queira recuar o texto de várias linhas no seu código:

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

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

O resultado será o seguinte:

Multiline text goes next:
first line
second line
third line
Igor
fonte
Indique explicitamente , usando a prosa, qual parte do código é importante para esse comportamento.
Shepmaster 7/01/19
No momento, isso parece não adicionar nada de novo à resposta aceita , que declara: é possível usar o \nescape da nova linha, [...] você pode escapar da nova linha e do espaço em branco inicial com a{backslash} . (é muito difícil digitar uma barra invertida no código em um comentário, ele aparece.)
Shepmaster
2
Esse comentário está sugerindo uma maneira de combinar os dois pontos na resposta aceita: como você pode produzir uma sequência de várias linhas, escrita como várias linhas no código, mas que ao mesmo tempo é permitido, por motivos estilísticos ou de legibilidade, obter seu próprio recuo no código, sem que esse recuo termine na string final. Não está muito claro no texto, mas é um caso de uso comum e, portanto, uma sugestão valiosa. (Veja a resposta por dtolnay para a versão de caixa de presente.)
Dato