Section courante

A propos

Section administrative du site

move

Déplacement
Rust

Syntaxe

let fermeture = move |paramètres| {
   // corps de la fermeture
};

Paramètres

Nom Description
paramètres Ce paramètre permet de définir les valeurs d'entrée que la fermeture accepte lorsqu'elle est appelée.
fermeture Ce paramètre permet de représenter une fonction anonyme capable de capturer des variables de son contexte.
corps de la fermeture Ce paramètre permet de contenir les instructions exécutées lorsque la fermeture est appelée.

Description

Ce mot réservé permet de faire en sorte qu'une fermeture s'approprie toutes ses captures.

Remarques

Permet une capture de l'environnement d'une fermeture par valeur.

move convertit toutes les variables capturées par référence ou référence mutable en variables capturées par valeur.

  1. let data = vec![1, 2, 3];
  2. let closure = move || println!("capturé {data:?} par valeur");
  3.  
  4. // les données ne sont plus disponibles, elles appartiennent à la fermeture

Remarque : les fermetures de déplacement peuvent toujours implémenter Fn ou FnMut, même si elles capturent des variables par déplacement. En effet, les caractéristiques implémentées par un type de fermeture sont déterminées par ce que la fermeture fait aux valeurs capturées, et non par la manière dont elle les capture.

  1. fn create_fn() -> impl Fn() {
  2.     let text = "Fn".to_owned();
  3.     move || println!("C'est un : {text}")
  4. }
  5.  
  6. let fn_plain = create_fn();
  7. fn_plain();

move est souvent utilisé lorsque des processus léger sont impliqués.

  1. let data = vec![1, 2, 3];
  2.  
  3. std::thread::spawn(move || {
  4.     println!("capturé {data:?} par valeur")
  5. }).join().unwrap();
  6.  
  7. // les données ont été déplacées vers le processus léger généré, nous ne pouvons donc pas les utiliser ici

move est également valide avant un bloc désynchronisée :

  1. let capture = "bonjour".to_owned();
  2. let block = async move {
  3.     println!("le Rust dit {capture} à partir du bloc asynchrone");
  4. };


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