Capturer l'environnement
Fait partie de la section Logic & Flow du Journey Rust de Coddy — leçon 62 sur 66.
L'une des fonctionnalités les plus puissantes des fermetures (closures) est leur capacité à capturer et à utiliser des variables de leur environnement environnant. Contrairement aux fonctions classiques, les fermetures peuvent « voir » et accéder aux variables qui existent dans la même portée (scope) où elles sont définies.
Voici comment fonctionne la capture d'environnement :
fn main() {
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // Cela affichera "The value of x is: 10"
}Dans cet exemple, la closure capture la variable x depuis la portée environnante et l'utilise à l'intérieur de son corps. La closure n'a pas besoin que x soit passé en tant que paramètre - elle y a automatiquement accès.
Vous pouvez également capturer des variables et les utiliser dans des calculs :
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // le résultat est 15Défi
FacileVous recevrez deux entrées. La première entrée est un nombre représentant un prix de base. La deuxième entrée est un nombre représentant un pourcentage de remise. Créez une fermeture (closure) qui capture le pourcentage de remise de l'environnement et calcule le prix final après application de la remise. Appelez la fermeture avec le prix de base et affichez le prix final.
Exigences :
- Lire la première entrée (prix de base) et supprimer les espaces blancs
- La convertir en
f64 - Lire la deuxième entrée (pourcentage de remise) et supprimer les espaces blancs
- La convertir en
f64 - Créeer une fermeture qui prend un paramètre (le prix de base) et capture le pourcentage de remise de l'environnement environnant
- La fermeture doit calculer le prix final en utilisant la formule :
base_price - (base_price * discount / 100.0) - Appeler la fermeture avec le prix de base
- Afficher le prix final
Entrée :
- Première ligne : Un prix de base (par exemple,
100.0) - Deuxième ligne : Un pourcentage de remise (par exemple,
20.0)
Sortie :
- Le prix final après application de la remise
Aide-mémoire
Les fermetures (closures) peuvent capturer et utiliser des variables de leur environnement environnant sans en avoir besoin comme paramètres.
Capture d'environnement de base :
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // Affiche "The value of x is: 10"Capture de variables dans des calculs :
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // le résultat est 15La fermeture capture automatiquement multiplier de la portée environnante et l'utilise dans le calcul.
Essayez vous-même
use std::io;
fn main() {
// Lire le prix de base
let mut base_price_input = String::new();
io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
// Lire le pourcentage de remise
let mut discount_input = String::new();
io::stdin().read_line(&mut discount_input).expect("Failed to read line");
let discount: f64 = discount_input.trim().parse().expect("Invalid number");
// TODO: Créer une closure qui capture la remise et calcule le prix final
// TODO: Appeler la closure avec le prix de base
// Afficher le prix final
// println!("{}", final_price);
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Structures de contrôle avancées
L'expression 'match'Filtrage de plusieurs valeursFiltrage d'intervallesL'expression 'if let'Les boucles en tant qu'expressionsRécapitulatif - Analyseur de commandes simple4Regrouper des données avec les structures
Qu'est-ce qu'une structure ?Aperçu des structuresAccéder aux champs d'une structureStructures mutablesLes structures comme paramètres de fonctionStructures tupleRécapitulatif - Créer une structure Book7Gestion des erreurs avec 'Result'
Qu'est-ce qu'un 'Result' ?Utiliser 'match' avec 'Result'is_ok() et is_err()Raccourcis : unwrap et expectL'opérateur point d'interrogation '?'Analyse de chaînes en nombresRécapitulatif - Fonction de division sécurisée10Closures & Fonctions anonymes
Qu'est-ce qu'une closure ?Définir une closure simpleClosures avec paramètresCapturer l'environnementRécapitulatif - Closure d'addition simple2Introduction aux vecteurs
Qu'est-ce qu'un vecteur ?Créer un vecteurAjouter des éléments avec pushAccéder aux éléments d'un vecteurItérer sur un vecteurItération mutableSupprimer des élémentsRécapitulatif - Suivi de score basique5Paires clé-valeur avec les Hash Maps
Qu'est-ce qu'une Hash Map ?Créer une Hash MapInsérer des paires clé-valeurAccéder aux valeursParcourir une Hash MapMettre à jour une valeurSupprimer une paireRécapitulatif - Compteur de mots8Projet : Inventaire d'articles simple
Configuration du projetAjouter un articleVérifier le stockVendre un articleAssembler le tout3Liste de tâches en ligne de commande
Configuration du projetAjouter une tâcheAfficher toutes les tâchesSupprimer une tâcheCode final