Quelle est la syntaxe d'un littéral de chaîne multiligne?


Réponses:


173

Tous les littéraux de chaîne peuvent être séparés sur plusieurs lignes; par exemple:

let string = "line one
line two";

est une chaîne de deux lignes, identique à "line one\nline two"(bien sûr, on peut aussi utiliser l' \néchappement de nouvelle ligne directement). Si vous souhaitez simplement couper une chaîne sur plusieurs lignes pour des raisons de formatage, vous pouvez échapper à la nouvelle ligne et à l'espace blanc de début avec un \; par exemple:

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

est le même que "one line written over several".

Si vous voulez des sauts de ligne dans la chaîne, vous pouvez les ajouter avant le \:

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

C'est la même chose que "multiple\nlines\nwith\nindentation";


2
Si seule la lisibilité est le problème, je voudrais ajouter la concat!()macro pour compléter les options données ( doc.rust-lang.org/std/macro.concat.html )
hakononakani

82

Si vous souhaitez faire quelque chose d'un peu plus long, qui peut ou non inclure des guillemets, des barres obliques inverses, etc., utilisez la notation littérale de chaîne brute :

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

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

Si vous avez des séquences de guillemets doubles et de symboles de hachage dans votre chaîne, vous pouvez désigner un nombre arbitraire de hachages comme délimiteur:

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

Mais ... vous n'avez besoin d'échapper aux nouvelles lignes que si vous ne voulez pas de nouvelles lignes dans le résultat, et les chaînes brutes n'aident pas avec cela.
poolie

Les chaînes brutes vous empêchent simplement d'ajouter un '\' à la fin de chaque ligne si vous ne vous souciez pas des nouvelles lignes (comme lorsque vous incorporez du code qui est agnostique aux nouvelles lignes comme les shaders et les noyaux) ou, comme vous l'avez mentionné à, lorsque les nouvelles lignes sont réellement nécessaires. Cela facilite simplement l'incorporation de code que vous voudrez peut-être modifier sans avoir à vous soucier du '\' à la fin de chaque ligne. C'est tout.
c0g

1
Si vous voulez (ou que cela ne vous dérange pas) de nouvelles lignes dans la chaîne résultante, les chaînes entre guillemets simples feront parfaitement l'affaire, comme indiqué dans les autres exemples. Si vous voulez éviter les nouvelles lignes, les chaînes brutes ne sont pas bonnes. Ils n'aident vraiment que si le texte comprend des guillemets, des barres obliques inverses, etc. - comme cela peut arriver dans une source intégrée.
poolie

2
Je vois où vous voulez en venir et vous avez absolument raison.
c0g du

1
Cela aiderait à montrer la sortie de l'impression de ces chaînes. D'après la réponse elle-même, je ne peux pas dire ce qui se passera avec les nouvelles lignes et comment l'indentation est gérée.
bluenote10

48

La réponse de Huon est correcte mais si l'indentation vous dérange, envisagez d'utiliser Indoc qui est une macro procédurale pour les chaînes multilignes indentées. Il signifie «document en retrait». Il fournit une macro appelée indoc!()qui prend un littéral de chaîne multiligne et l'annule pour que le caractère non espace le plus à gauche se trouve dans la première colonne.

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

Le résultat est "line one\nline two\n".

L'espace blanc est conservé par rapport au caractère non espace le plus à gauche dans le document, de sorte que ce qui suit a la ligne deux en retrait de 3 espaces par rapport à la première ligne:

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

Le résultat est "line one\n line two\n".


8

Si vous souhaitez mettre en retrait du texte multiligne dans votre code:

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

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

Le résultat sera le suivant:

Multiline text goes next:
first line
second line
third line

Veuillez indiquer explicitement , en prose, quel élément du code est important pour ce comportement.
Shepmaster

Pour le moment, cela semble n'ajouter rien de nouveau à la réponse acceptée , qui stipule: on peut utiliser l' \néchappement de nouvelle ligne, [...] vous pouvez échapper à la nouvelle ligne et à l'espace blanc de début avec un{backslash} . (il est très difficile de taper une barre oblique inverse dans le code dans un commentaire, il semble.)
Shepmaster

2
Ce commentaire suggère un moyen de combiner les deux points dans la réponse acceptée: comment produire une chaîne multiligne, écrite sous forme de lignes multiples dans le code, mais qui en même temps est autorisé - pour des raisons stylistiques ou de lisibilité - obtenir sa propre indentation dans le code, sans que cette indentation se termine par la chaîne finale. Ce n'est pas très clair dans le texte, mais c'est un cas d'utilisation courant et donc une suggestion précieuse à mon avis. (Voir la réponse de dtolnay pour la version caisse de ceci.)
Dato
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.