Section courante

A propos

Section administrative du site

union

Union
Rust

Syntaxe

union NomUnion {
   champ1: Type1,
   champ2: Type2,
   // ...
}

Paramètres

Nom Description
NomUnion Ce paramètre permet de définir le nom de l'union, étant utilisé comme type utilisateur dans le code.
champ1 Ce paramètre permet de déclarer un des champs de l'union, partageant le même espace mémoire avec les autres.
Type1 Ce paramètre permet d'indiquer le type associé au champ de l'union.
champ2 Ce paramètre permet d'ajouter un autre champ à l'union, également dans la même zone mémoire.
Type2 Ce paramètre permet de préciser le type du second champ de l'union.

Description

Ce mot réservé permet de définir une union et n'est qu'un mot clef lorsqu'il est utilisé dans une déclaration d'union.

Remarques

Permet d'indiquer l'équivalent Rust d'une union de style C.

Une union ressemble à une structure en termes de déclaration, mais tous ses champs existent dans la même mémoire, superposés les uns aux autres. Par exemple, si nous voulions des bits en mémoire que nous interprétons parfois comme un u32 et parfois comme un f32, nous pourrions écrire :

  1. union IntOrFloat {
  2.     i: u32,
  3.     f: f32,
  4. }
  5.  
  6. let mut u = IntOrFloat { f: 1.0 };
  7. // La lecture des champs d'un syndicat est toujours dangereuse
  8. assert_eq!(unsafe { u.i }, 1065353216);
  9. // La mise à jour de l'un des champs les modifiera tous.
  10. u.i = 1073741824;
  11. assert_eq!(unsafe { u.f }, 2.0);

Correspondance sur les unions

Il est possible d'utiliser la correspondance de motifs sur les unions. Un seul nom de champ doit être utilisé et correspondre au nom d'un des champs de l'union. Comme pour la lecture d'une union, la correspondance de motifs sur une union requiert unsafe.

  1. union IntOrFloat {
  2.     i: u32,
  3.     f: f32,
  4. }
  5.  
  6. let u = IntOrFloat { f: 1.0 };
  7.  
  8. unsafe {
  9.     match u {
  10.         IntOrFloat { i: 10 } => println!("J'en ai trouvé exactement dix!"),
  11.         // La correspondance du champ « f » fournit un « f32 ».
  12.         IntOrFloat { f } => println!("Found f = {f} !"),
  13.     }
  14. }

Références aux champs d'union

Tous les champs d'une union sont au même emplacement en mémoire, ce qui signifie qu'emprunter un champ équivaut à emprunter l'union entière, pour la même durée de vie :

  1. union IntOrFloat {
  2.     i: u32,
  3.     f: f32,
  4. }
  5.  
  6. let mut u = IntOrFloat { f: 1.0 };
  7.  
  8. let f = unsafe { &u.f };
  9. // Cela ne sera pas compilé car le champ a déjà été emprunté, même si ce n'est que de manière immuable
  10. let i = unsafe { &mut u.i };
  11.  
  12. *i = 10;
  13. println!("f = {f} and i = {i}");


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