Assembler des chaînes en Rust : TOP 5 des erreurs de débutants (et comment les éviter)

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi ne peut-on pas simplement additionner des chaînes en Rust ?

\n\n

Si vous êtes passé à Rust depuis Python ou JavaScript, la première chose qui vous a probablement choqué est la tentative d'écrire "Hello, " + "world!". Le compilateur vous accueille avec une vague rouge et un message d'erreur mystérieux. Dans le monde Python, cela aurait fonctionné instantanément, mais Rust est un autre animal. La question "How do I concatenate strings?" sur Stack Overflow a recueilli des centaines de milliers de vues, et ce n'est pas un hasard.

\n\n

Le problème est que la concaténation de chaînes en Rust n'est pas simplement du sucre syntaxique. C'est une question de gestion de la mémoire, de propriété (ownership) et de types de données. Si vous êtes débutant, vous pouvez facilement tomber dans les pièges classiques : perdre la propriété d'une chaîne, copier accidentellement des gigaoctets de données ou simplement vous perdre entre String et &str.

\n\n

Dans cet article, nous allons analyser les 5 erreurs les plus fréquentes que commettent les débutants lors de l'assemblage de chaînes en Rust, et montrer comment les éviter. Vous apprendrez quand utiliser +, quand utiliser format!, et quand utiliser push_str. C'est parti !

\n\n

Erreur n°1 : Oublier la prise de propriété (ownership)

\n\n

À quoi cela ressemble

\n\n

Imaginez que vous écrivez ce code :

\n\n
let s1 = String::from("Bonjour");\nlet s2 = String::from(", le monde !");\nlet s3 = s1 + &s2; // Erreur ? Ou pas ?\nprintln!("{}", s1); // Erreur de compilation !
\n\n

Vous vous attendez à ce que s1 reste accessible, mais le compilateur dit : "Non, s1 a été déplacé (moved)".

\n\n

Quelle est l'essence de l'erreur

\n\n

En Rust, l'opérateur + pour les chaînes utilise la signature fn add(self, s: &str) -> String. Notez le self — cela signifie que la première chaîne est consommée (consumes) et que vous ne pouvez plus l'utiliser. Vous "donnez" littéralement s1 à la fonction add, et elle devient inaccessible.

\n\n

Comment corriger

\n\n

Il y a deux façons :

\n\n
    \n
  • Cloner la chaîne (si vous avez besoin de l'originale) : let s3 = s1.clone() + &s2;
  • \n
  • Changer l'ordre ou utiliser format! :
  • \n
\n\n
let s1 = String::from("Bonjour");\nlet s2 = String::from(", le monde !");\nlet s3 = format!("{}{}", s1, s2); // s1 et s2 restent accessibles\nprintln!("{}", s1); // Fonctionne !
\n\n

Conseil : Si vous ne prévoyez pas d'utiliser s1 après la concaténation, utilisez + sans hésiter. C'est plus rapide que format!, car cela ne crée pas un nouveau buffer à partir de zéro.

\n\n

Erreur n°2 : Confusion entre String et &str

\n\n

À quoi cela ressemble

\n\n

Vous essayez d'additionner une String avec un littéral :

\n\n
let s = String::from("Hello");\nlet result = s + " world"; // Fonctionne !
\n\n

Mais si vous essayez l'inverse :

\n\n
let s = "Hello";\nlet result = s + String::from(" world"); // Erreur !
\n\n

Quelle est l'essence de l'erreur

\n\n

L'opérateur + fonctionne uniquement lorsque la partie gauche est une String et la partie droite un &str. Le littéral " world" est automatiquement un &str, donc le premier exemple fonctionne. Dans le second exemple, s est un &str, qui n'a pas de méthode add.

\n\n

Comment corriger

\n\n

Convertissez &str en String ou utilisez format! :

\n\n
let s = "Hello";\nlet result = format!("{} {}", s, "world"); // Méthode universelle\n// Ou\nlet result = s.to_string() + " world"; // to_string() crée une String
\n\n

Règle d'or : String est un type propriétaire (owned), &str est un emprunt (borrow). La concaténation nécessite toujours la propriété à gauche.

\n\n

Erreur n°3

Blogs

Book Recommendations