web-dev-qa-db-fra.com

Comment écrire une chaîne multi-lignes dans Rust?

Est-il possible d'écrire quelque chose comme:

fn main() {
    let my_string: &str = "Testing for new lines \
                           might work like this?";
}
46
sdasdadas

Si je lis le référence de langue correctement, alors il semble que cela devrait fonctionner. La référence de langue indique que \n etc. sont pris en charge (en tant qu'échappements courants, pour insérer des sauts de ligne dans votre chaîne), ainsi que des "échappements supplémentaires", y compris LF, CR et HT.

39
user1024732

Une autre façon de le faire est d'utiliser un littéral de chaîne brut :

Les littéraux de chaîne bruts ne traitent aucun échappement. Ils commencent par le caractère U+0072 (r), suivi de zéro ou plus du caractère U+0023 (#) et un U+0022 (guillemet double). Le corps de chaîne brut peut contenir n'importe quelle séquence de caractères Unicode et se termine uniquement par un autre U+0022 (guillemet double), suivi du même nombre de U+0023 (#) caractères qui ont précédé l'ouverture U+0022 (guillemet double).

Tous les caractères Unicode contenus dans le corps de chaîne brut se représentent eux-mêmes, les caractères U+0022 (guillemet double) (sauf lorsqu'il est suivi d'au moins autant U+0023 (#) caractères utilisés pour démarrer la chaîne brute littérale) ou U+005C (\) n'ont pas de signification particulière.

Exemples de littéraux de chaîne:

"foo"; r"foo";                     // foo
"\"foo\""; r#""foo""#;             // "foo"

"foo #\"# bar";
r##"foo #"# bar"##;                // foo #"# bar

"\x52"; "R"; r"R";                 // R
"\\x52"; r"\x52";                  // \x52
35
Moebius

Il existe deux façons d'écrire des chaînes multilignes dans Rust qui ont des résultats différents . Vous devez choisir entre elles avec attention en fonction de ce que vous essayez d'accomplir.

Méthode 1: espaces suspendus

Si une chaîne commençant par " contient un saut de ligne littéral, le compilateur Rust "engloutira" tous les espaces entre le dernier caractère non blanc de la ligne et le premier caractère non blanc de la ligne suivante, et remplacez-les par un seul.

Exemple:

fn test() {
    println!("{}", "hello  
    world");
}

Quel que soit le nombre de caractères littéraux (espace vide) (zéro ou cent) qui apparaissent après hello, la sortie de ce qui précède sera toujours hello world.

Méthode 2: saut de ligne barre oblique inverse

C'est exactement le contraire. Dans ce mode, tous les espaces avant un littéral \ sur la première ligne est conservé et tous les espaces suivants sur la ligne suivante sont également conservés.

Exemple:

fn test() {
    println!("{}", "hello  \
    world");
}

Dans cet exemple, la sortie est hello world.

De plus, comme mentionné dans une autre réponse, Rust a des chaînes "littérales brutes", mais elles n'entrent pas dans cette discussion comme dans Rust (contrairement à d'autres langues) qui ont besoin de recourir à des chaînes brutes pour cela) prend en charge les sauts de ligne littéraux dans le contenu cité sans restrictions, comme nous pouvons le voir ci-dessus.

2
Mahmoud Al-Qudsi

Si vous souhaitez éviter d'avoir des caractères de nouvelle ligne et des espaces supplémentaires, vous pouvez utiliser le concat! macro. Il concatène les littéraux de chaîne au moment de la compilation.

let my_string = concat!(
    "Testing for new lines ",
    "might work like this?",
);

assert_eq!(my_string, "Testing for new lines might work like this?");

Le réponse acceptée avec la barre oblique inverse supprime également les espaces supplémentaires.

1
Michael Bausano