1. #1
    Membre averti Avatar de Kennel sébastien
    Homme Profil pro
    Développeur
    Inscrit en
    septembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : septembre 2008
    Messages : 226
    Points : 327
    Points
    327

    Par défaut Les fonctions divergentes

    Bonjour,

    Quelqu'un peut-il m'expliquer à quoi ça sert ? Comment ça marche ? Merci Beaucoup.

    Car je lis la doc ici :
    https://doc.rust-lang.org/book/functions.html

    Je comprends que ça dit simplement que la fonction ne retourne pas de valeur, ok.

    Je teste l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fn main() {
        diverges();
    }
    
    fn diverges() -> ! {
        panic!("This function never returns!");
    }
    Ok, ça roule :-)

    Puis je teste autrement, avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fn main() {
        diverges();
    }
    
    fn diverges() -> ! {
        println!("This function never returns!");
    }
    Ça plante avec l'erreur :
    error: computation may converge in a function marked as diverging [E0270]

    Je n'ai pas compris, j'ai bien le point-virgule comme l'instruction ne se retournera pas.

    Puis plus bas c'est encore plus bizarre, ça dit que la fonction divergente peut prendre n'importe quels types en retour !!!

    L'exemple repris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fn main() {
        let x:i32 = diverges();
    }
    
    fn diverges() -> ! {
        panic!("This function never returns!");
    }
    Ok ça roule, ça dit juste que la variable n'est pas utilisé avec :
    warning: unused variable: `x`, #[warn(unused_variables)] on by default

    Mais j'ai toujours pas compris l’intérêt de ce truc !!!

    Donc ça sert à quoi !? Merci.
    Vous cherchez à apprendre les bases en langage « C », « Go », « Rust », « PHP 7 », « Java 9 » ou « Python 3 » ? N'hésitez pas à me contacter par MP.

  2. #2
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2010
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2010
    Messages : 812
    Points : 1 927
    Points
    1 927

    Par défaut

    C'est utilisé soit pour des fonctions qui ne sont pas censées retourner (dans laquelle tu pourrais avoir une bouche infinie par-exemple) ou dans des fonctions qui appellent panic!. Un post assez intéressant en parle sur stackoverflow.
    Il y a 10 sortes de gens : ceux qui comptent en binaire et les autres.

    "Premature optimization is the root of all evil" --Donald Knuth
    traduction : "L'optimisation prématurée est la racine de tous les maux" -- Donald Knuth

    Si vous voulez apprendre à développer en Rust, un tuto (en français) est disponible ici.
    Si vous voulez voir mes projets, c'est sur github que ça se passe.

  3. #3
    Membre averti Avatar de Kennel sébastien
    Homme Profil pro
    Développeur
    Inscrit en
    septembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : septembre 2008
    Messages : 226
    Points : 327
    Points
    327

    Par défaut

    Merci bien imperio, pour le lien.

    Nous pouvons aussi placer un exit, ça marche.

    En revanche juste pour teste, une valeur « None » fait planter avec :
    error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]

    J'aime bien le langage, vraiment excellent pour le WEB, mais il me prend plus de temps à tout comprendre que « Go » dernièrement…

    Mais sûr, je vais faire un cours la dessus !
    Vous cherchez à apprendre les bases en langage « C », « Go », « Rust », « PHP 7 », « Java 9 » ou « Python 3 » ? N'hésitez pas à me contacter par MP.

  4. #4
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2010
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2010
    Messages : 812
    Points : 1 927
    Points
    1 927

    Par défaut

    Parce que None est une enum pouvant contenir une valeur, il te faut donc specifier cette valeur a un moment ou un autre pour que Rust sache à quoi ce None correspond. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let x: Option<u32> = None;
    Il y a 10 sortes de gens : ceux qui comptent en binaire et les autres.

    "Premature optimization is the root of all evil" --Donald Knuth
    traduction : "L'optimisation prématurée est la racine de tous les maux" -- Donald Knuth

    Si vous voulez apprendre à développer en Rust, un tuto (en français) est disponible ici.
    Si vous voulez voir mes projets, c'est sur github que ça se passe.

Discussions similaires

  1. doc sur les fonctions
    Par masterfab dans le forum C
    Réponses: 18
    Dernier message: 23/06/2005, 17h55
  2. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58
  3. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  4. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  5. Réponses: 7
    Dernier message: 24/05/2003, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo