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

Ruby Discussion :

Besoin d'explication sur un code


Sujet :

Ruby

  1. #1
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut Besoin d'explication sur un code
    Bonjour

    En parcourant un site ruby, je suis tombé sur ce code abscon (tout au moins pour moi) , dont voici un extrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!ruby -an
    h||=($>.sync=$F=$F[3,2];{"-1"=>-1})
    En fouillant les sites ruby j'ai réussi à comprendre la première ligne, mais j'avoue que la deuxième me laisse perplexe.
    Je crois comprendre que la sortie standard $> et l'entrée standard $F sont synchronisées mais je dois sûrement me planter.
    Pouvez vous éclairer ma lanterne ?

    Merci
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  2. #2
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Bonjour

    En parcourant un site ruby, je suis tombé sur ce code abscon (tout au moins pour moi) , dont voici un extrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!ruby -an
    h||=($>.sync=$F=$F[3,2];{"-1"=>-1})
    En fouillant les sites ruby j'ai réussi à comprendre la première ligne, mais j'avoue que la deuxième me laisse perplexe.
    Je crois comprendre que la sortie standard $> et l'entrée standard $F sont synchronisées mais je dois sûrement me planter.
    Pouvez vous éclairer ma lanterne ?

    Merci
    $> et F sont des alias, donc ils ont des valeurs par défaut, mais ces valeurs peuvent-être modifié.

    La méthode sync est une boolean. Donc les 4 valeurs acceptable sont : False, True, 1 , -1.

    Ce que j'en comprend est : si la valeur de h est nil, le type de synchronisation de STOUT sera déterminer avec les 2 caractères après le troisième caractère contenu dans F (probablement: -1 ou 1 ). En somme, cela détermine si y a une utilisation de mémoire-tampon pour la sortie standard.




    STDOUT.sync =true
    puts 'allo....'
    sleep 2
    puts 'a la prochaine'
    Fait un test en changeant la valeur de sync pour false

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ok merci pour ces explications.
    J'ai fait ton test, je n'ai pas vu beaucoup de différences mais peut-être est du au fait que je fais du ruby sous Windows.
    En testant le code j'ai cru comprendre que {"-1"=>-1} permettait de convertir les chaines en entiers (un genre de map &:to_int)
    C'est ça ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Ok merci pour ces explications.
    J'ai fait ton test, je n'ai pas vu beaucoup de différences mais peut-être est du au fait que je fais du ruby sous Windows.
    En testant le code j'ai cru comprendre que {"-1"=>-1} permettait de convertir les chaines en entiers (un genre de map &:to_int)
    C'est ça ?
    Et bien sous Linux, la différence est que dans un cas, il y a un délai de quelques secondes entre l'apparition de la première phrase et de la seconde. Et dans le deuxième cas, les deux phrases apparaissent ensemble. D'après ce que j'ai pu comprendre, l'astuce permet de choisir si une mémoire tampon est utilisé ou non à la sortie. Pour le genre de situation ou le programmeur veut avoir une réaction sans délai comme par exemple un jeu comme Tétris.

    {"-1"=>-1} permettait de convertir les chaines en entiers (un genre de map &:to_int)

    C'est probablement le cas. C'est probablement un type qui utilise Ruby comme un C interprété. Je ne comprend pas l'avantage sur la méthode .to_i . Mais comme je ne dispose pas de tout le programme je ne peu pas juger.

    $>.sync=$F=$F
    Ce code reste très mystérieux pour moi. Cette double assignation, c'est du jamais vu pour moi. Donc pour le coup, je ne suis pas certain de détenir la vérité sur ce bout de programme. J'espère avoir pu d'aider un peu.

    Une dernière chose, le STDIN fonctionne assez mal sous Windows pour la plupart des éditeurs. Ce qui fait que l'on doit lancer le programme par une ligne de commande. Geany te dispense de cette corvée. https://www.geany.org/

    Le menu n'est pas bien fait. Et la documentation est pauvre. Mais si tu utilise la commande 'compile' et ' 'execute' tu pourra vérifier la syntaxe et faire fonctionne ton programme en Ruby. J'ai même réussi à modifier le menu pour lancer 'Byebug'

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Voilà le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!ruby -an
    h||=($>.sync=$F=$F[3,2];{"-1"=>-1})
    f,m,d=$F
    d||(h[f]=m;next)
    puts (h[f].to_i-m.to_i)*(d<=>?O)<0?"BLOCK":"WAIT"
    On remplir le tableau avec une boucle.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Voilà le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!ruby -an
    h||=($>.sync=$F=$F[3,2];{"-1"=>-1})
    f,m,d=$F
    d||(h[f]=m;next)
    puts (h[f].to_i-m.to_i)*(d<=>?O)<0?"BLOCK":"WAIT"
    On remplir le tableau avec une boucle.
    Après avoir lue sur des éléments de ce code, je me demande s'il ne s'agirait d'une astuce pour obtenir l'équivalent de la fonction getc du langage C en Ruby.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Oui ça s'apparente à ça, mais c'est assez abscon !
    J'ai l'impression que ruby recèle d'astuces de ce genre.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Oui ça s'apparente à ça, mais c'est assez abscon !
    J'ai l'impression que ruby recèle d'astuces de ce genre.
    En général. les interpréteurs, à la base, ne sont pas très prêt du métal. Les trucs comme l'accès au caméra ou le contrôle du volume ne sont pas aisé. Et Ruby n'est pas différent dans ce domaine. Le truc où Ruby est clairement dans une classe à part, mais vraiment part de tout les langages. est la méta-programmation. Tellement que les programmeurs expérimentés ont tendance en abuser. Et comme ce concept est aussi étrange que de passer d'un langage déclaratif à un langage impératif. Et en plus, ces programmeurs utilisent le terme de 'magique' ou lieu de méta-programmation, cela désarçonne beaucoup de débutants et cela était en train de tuer le langage. L'arrivée de Cristal va changer la donne et va limité les abus.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/03/2014, 09h54
  2. besoin d'explication sur un code
    Par joelulrich dans le forum Débuter
    Réponses: 5
    Dernier message: 06/11/2010, 18h44
  3. Besoin d'explications sur un code
    Par poustiquette dans le forum Langage
    Réponses: 3
    Dernier message: 20/09/2008, 20h04
  4. besoin d'explications sur un code
    Par NAHIAG dans le forum C
    Réponses: 8
    Dernier message: 28/05/2006, 12h37
  5. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51

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