En tant que paramètres de sortie

Beginner

This tutorial is from open-source community. Access the source code

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 avec rustc 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 :

  • Fn
  • FnMut
  • FnOnce

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.