Section courante

A propos

Section administrative du site

struct

Structure
Rust

Syntaxe

struct NomDeLaStruct {
   champ1: Type1,
   champ2: Type2,
}

Paramètres

Nom Description
NomDeLaStruct Ce paramètre permet de donner un nom à la structure définie, qui sera utilisée comme type personnalisé.
champ1, champ2 Ce paramètre permet de déclarer les noms des champs (ou attributs) de la structure.
Type1, Type2 Ce paramètre permet de spécifier les types des valeurs associées à chaque champ de la structure.

Description

Ce mot réservé permet de définir une structure.

Remarques

Un type composé d'autres types.

Les structures Rust se déclinent en trois types : les structures avec champs nommés, les structures tuples et les structures unitaires.

  1. struct Regular {
  2.     field1: f32,
  3.     field2: String,
  4.     pub field3: bool
  5. }
  6.  
  7. struct Tuple(u32, String);
  8.  
  9. struct Unit;

Les structures classiques sont les plus couramment utilisées. Chaque champ qu'elles contiennent possède un nom et un type, et une fois défini, il est accessible via la syntaxe example_struct.field. Les champs d'une structure partagent sa mutabilité ; foo.bar = 2; ne serait donc valide que si foo était mutable. Ajouter pub à un champ le rend visible pour le code des autres modules, et permet d'y accéder et de le modifier directement.

Les structures tuples sont similaires aux structures classiques, mais leurs champs n'ont pas de nom. Elles s'utilisent comme des tuples, avec une déconstruction possible via la syntaxe let TupleStruct(x, y) = foo;. Pour accéder aux variables individuelles, la même syntaxe est utilisée que pour les tuples classiques, à savoir foo.0, foo.1,..., en commençant à zéro.

Les structures unitaires sont le plus souvent utilisées comme marqueurs. Leur taille est de zéro octet, mais contrairement aux énumérations vides, elles peuvent être instanciées, ce qui les rend isomorphes au type unit(). Les structures unitaires sont utiles lorsque vous devez implémenter un trait sur quelque chose, mais que vous n'avez pas besoin de entreposer de données à l'intérieur.

Instanciation

Les structures peuvent être instanciées de différentes manières, et peuvent être combinées selon les besoins. La méthode la plus courante consiste à utiliser une méthode constructeur telle que new(). Cependant, lorsque cette méthode n'est pas disponible (ou que vous écrivez le constructeur lui-même), la syntaxe littérale de structure est utilisée :

  1. let example = Foo {
  2.     field1: 42.0,
  3.     field2: "blah".to_string(),
  4.     etc: true,
  5. };

Il n'est possible d'instancier directement une structure à l'aide de la syntaxe littérale de structure que si tous ses champs sont visibles.

De nombreux raccourcis facilitent l'écriture des constructeurs, le plus courant étant le raccourci « Field Init ». Lorsqu'une variable et un champ portent le même nom, l'affectation peut être simplifiée de « field: field » à « field ». L'exemple suivant d'un constructeur hypothétique illustre ce principe :

  1. struct User {
  2.     name: String,
  3.     admin: bool,
  4. }
  5.  
  6. impl User {
  7.     pub fn new(name: String) -> Self {
  8.         Self {
  9.             name,
  10.             admin: false,
  11.         }
  12.     }
  13. }

Un autre raccourci pour l'instanciation de structure est disponible, utilisé lorsque vous devez créer une nouvelle structure ayant les mêmes valeurs que la plupart d'une structure précédente du même type, appelée syntaxe de mise à jour de structure :

  1. let updated_thing = Foo {
  2.     field1: "une nouvelle valeur".to_string(),
  3.     ..thing
  4. };

Les structures de tuples sont instanciées de la même manière que les tuples eux-mêmes, mais avec leur nom comme préfixe : Foo(123, false, 0.1).

Les structures vides sont instanciées avec leur nom seul et ne nécessitent rien d'autre. let thing = EmptyStruct;

Conventions de style

Les structures sont toujours écrites en UpperCamelCase, à quelques exceptions près. Bien que la virgule finale de la liste des champs d'une structure puisse être omise, elle est généralement conservée pour faciliter l'ajout et la suppression de champs ultérieurement.



Dernière mise à jour : Vendredi, le 1er Août 2025