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.
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"
.
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##"#
"###;
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"
.
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