Initialisation des structures en Rust : démarrage rapide et astuces avancées

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 l'initialisation des structures en Rust n'est-elle pas ennuyeuse ?

\n\n

Si vous avez déjà écrit en Rust, vous avez sûrement rencontré le moment où vous voulez dire : « Mais pourquoi dois-je encore et encore écrire field: field ? C'est évident ! ».

\n\n

Oui, Rust est un langage sévère, strict et incroyablement expressif. Mais même lui a une place pour le sucre syntaxique, qui rend le code plus court, plus propre et plus agréable à l'œil. Cela concerne particulièrement l'initialisation des structures — cette routine que nous faisons des dizaines de fois par jour.

\n\n

Dans cet article, nous ne répondons pas simplement à une question populaire sur Stack Overflow : « Existe-t-il un moyen plus rapide/plus court d'initialiser des variables dans une struct Rust ? ». Nous allons analyser toutes les méthodes — des basiques aux avancées — et montrer comment écrire un code à la fois rapide, lisible et « rustique » (idiomatic Rust).

\n\n

Prêt à accélérer votre travail avec Rust struct ? C'est parti !

\n\n

1. Méthode classique : nommage explicite des champs

\n\n

Commençons par les bases. Supposons que nous ayons une structure User :

\n\n
struct User {\n    username: String,\n    email: String,\n    sign_in_count: u64,\n    active: bool,\n}
\n\n

L'initialisation standard ressemble à ceci :

\n\n
let user1 = User {\n    email: String::from("someone@example.com"),\n    username: String::from("someusername123"),\n    active: true,\n    sign_in_count: 1,\n};
\n\n

Tout est honnête, tout est explicite. Mais quand vous avez 10 à 15 champs et que les noms de variables correspondent aux noms des champs — cela commence à agacer. Vous écrivez email: email et vous vous sentez comme un bureaucrate remplissant un formulaire.

\n\n

Bonne nouvelle : Rust le ressent aussi. Et il a trouvé une solution.

\n\n

2. Field Init Shorthand : quand le nom de la variable correspond au champ

\n\n

Depuis Rust 1.17, vous pouvez utiliser une notation abrégée si le nom de la variable correspond au nom du champ de la structure. Cela s'appelle field init shorthand.

\n\n
let email = String::from("someone@example.com");\nlet username = String::from("someusername123");\n\nlet user1 = User {\n    email,  // au lieu de email: email\n    username, // au lieu de username: username\n    active: true,\n    sign_in_count: 1,\n};
\n\n

Joli, n'est-ce pas ? Rust comprend tout seul que email est à la fois une variable et un champ. Cette astuce est particulièrement pratique lorsque vous transmettez des paramètres de fonction déjà nommés de manière significative.

\n\n

Quand l'utiliser : toujours lorsque le nom de la variable correspond au nom du champ. Ce n'est pas seulement « plus rapide à écrire », c'est du Rust idiomatique.

\n\n

3. Struct Update Syntax : copier une structure avec modifications

\n\n

Supposons que nous ayons déjà user1 et que nous voulions créer user2 en modifiant uniquement l'email. Devons-nous vraiment réécrire tous les champs ? Non !

\n\n
let user2 = User {\n    email: String::from("another@example.com"),\n    ..user1  // les autres champs sont pris de user1\n};
\n\n

L'opérateur .. est le struct update syntax. Il dit au compilateur : « Prends tous les champs restants de user1 ». Important : après cela, user1 sera partiellement déplacé (si les champs n'implémentent pas Copy), alors soyez prudent avec la propriété.

\n\n

Cette syntaxe économise des lignes entières lorsque vous travaillez avec l'initialisation des structures Rust à partir de données existantes.

\n\n

4. Trait Default : initialisation avec valeurs par défaut

\n\n

Et si la plupart des champs doivent avoir des valeurs standard ? Par exemple, active: true et sign_in_count: 0 ? Vous pouvez implémenter le trait Default :

\n\n
#[derive(Default)]\nstruct User {\n    username: String,\n    email: String,\n    active: bool,\n    sign_in_count: u64,\n}\n\n// Maintenant :\nlet user_default = User::default();\n// username: "", email: "", active: false, sign_in_count: 0
\n\n

Mais attendez !

Blogs

Book Recommendations