Considérations théoriques
Reprenons cette ligne issue du chapitre Les vecteurs en langage Rust :
vecteur_entiers.retain(|&x| x % 2 == 0);
La méthode retain attend une lambda-expression (une closure), qui lui permet de garder les éléments du vecteur qui répondent à un certain critère. retain
Entre les deux barres verticales « | | », on représente une référence vers un élément du vecteur. On ne conservera que ceux qui répondent au critère, en l’occurrence celui d’être un nombre pair, exprimé par x % 2 == 0.
Si on essaie de définir une closure en Rust, on dira qu’elle correspond à ce que l’on appelle, dans divers langages, une fonction anonyme. Cela peut par exemple évoquer LINQ en langage C#. Plusieurs usages sont à noter : Closure
-
Stocker cette fonction anonyme dans une simple variable, pour réutilisation.
-
Passer cette fonction anonyme en paramètre d’une autre fonction, comme par exemple avec retain.
Un avantage comparatif important des closures est qu’elles ont accès à des valeurs définies dans la portée dans laquelle elles sont définies. Au contraire, une simple fonction peut manipuler des paramètres qui lui sont passés, mais n’aura pas nécessairement accès à certaines variables de la portée dans laquelle elle est définie.
Précisons un point linguistique :...