Introduction
Dans ce laboratoire, nous apprenons que les closures peuvent être utilisées comme paramètres d'entrée et également renvoyées comme paramètres de sortie en utilisant impl Trait et en spécifiant les traits valides (Fn, FnMut, FnOnce). Le mot clé move est utilisé pour indiquer que toutes les captures se produisent par valeur, évitant les références invalides.
Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser
main.rs, le compiler et l'exécuter avecrustc main.rs &&./main.
En tant que paramètres de sortie
Il est possible d'utiliser des closures comme paramètres d'entrée, donc il devrait également être possible de renvoyer des closures comme paramètres de sortie. Cependant, les types de closures anonymes sont, par définition, inconnus, donc nous devons utiliser impl Trait pour les renvoyer.
Les traits valides pour renvoyer une closure sont :
FnFnMutFnOnce
En outre, le mot clé move doit être utilisé, ce qui indique que toutes les captures se produisent par valeur. Cela est nécessaire car toute capture par référence serait supprimée dès que la fonction se termine, laissant des références invalides dans la closure.
fn create_fn() -> impl Fn() {
let text = "Fn".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnmut() -> impl FnMut() {
let text = "FnMut".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnonce() -> impl FnOnce() {
let text = "FnOnce".to_owned();
move || println!("This is a: {}", text)
}
fn main() {
let fn_plain = create_fn();
let mut fn_mut = create_fnmut();
let fn_once = create_fnonce();
fn_plain();
fn_mut();
fn_once();
}
Sommaire
Félicitations ! Vous avez terminé le laboratoire As Output Parameters. Vous pouvez pratiquer d'autres laboratoires dans LabEx pour améliorer vos compétences.