web-dev-qa-db-fra.com

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

J'ai du mal à comprendre comment fonctionne la syntaxe de chaîne dans Rust. Plus précisément, j'essaie de comprendre comment créer une chaîne de plusieurs lignes.

87
Dumbapples

Tous les littéraux de chaîne peuvent être divisés en 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 utiliser le \n _ newline s’échappe directement aussi). Si vous souhaitez simplement séparer une chaîne sur plusieurs lignes pour des raisons de formatage, vous pouvez échapper à la nouvelle ligne et aux espaces blancs avec un \, par exemple.

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

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

115
huon

Si vous souhaitez faire quelque chose un peu plus long, qui peut inclure ou non des guillemets, des barres obliques inverses, etc., utilisez 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 des symboles de hachage dans votre chaîne, vous pouvez désigner un nombre arbitraire de hachages en tant que délimiteur:

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

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. Cela signifie "document en retrait". Il fournit une macro appelée indoc!() qui prend un littéral multiligne et le met en retrait de sorte 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".

Si vous préférez, il existe quelques moyens équivalents pour formater la même chose. Choisissez donc celle que vous préférez. Les deux suivants entraînent la même chaîne que ci-dessus. Le contenu peut être mis en retrait autant que vous le souhaitez - il ne doit pas nécessairement s'agir d'un nombre d'espaces spécifique.

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

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

Les espaces sont préservés par rapport au caractère non-espace le plus à gauche du document. Par conséquent, la ligne suivante a deux lignes en retrait de 3 espaces par rapport à la ligne un:

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

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

36
dtolnay

Si vous souhaitez insérer 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
7
Igor