IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Rust Discussion :

Les fonctions divergentes


Sujet :

Rust

  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 : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 226
    Points : 329
    Points
    329
    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.

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    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.

  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 : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 226
    Points : 329
    Points
    329
    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 !

  4. #4
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    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;

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