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 :

Question bête (où est passé le ++ ?)


Sujet :

Ruby

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 190
    Points : 53
    Points
    53
    Par défaut Question bête (où est passé le ++ ?)
    Bonjour,

    Dans les langages comme Java, C# ou encore Objective-C, il existe la syntaxe ++ pour incrémenter.

    Quelqu'un pourrait-il m'expliquer pourquoi elle n'existe pas dans Ruby et plus que ça, pourquoi la méthode next n'est pas disponible dans les Fixnum alors qu'elle fonctionne très bien avec les String ?

    Merci (je cherche juste à comprendre).

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Une réponse "officielle" :
    (1) ++ and -- are NOT reserved operator in Ruby.

    (2) C's increment/decrement operators are in fact hidden assignment. They affect variables, not objects. You cannot accomplish assignment via method. Ruby uses +=/-= operator instead.

    (3) self cannot be a target of assignment. In addition, altering the value of integer 1 might cause severe confusion throughout the program.

    matz.
    En résumé c'est la nature même de Ruby (tout est objet) et un choix des concepteurs du langage qui fait que ces opérateurs d'incrémentation n'existent pas. Car ++ est en fait une affectation cachée d'une nouvelle valeur sur la variable incrémentée. Pour que cela soit plus clair et éviter des erreurs de compréhension : une affectation passe par un opérateur = en Ruby.
    L'équivalent est donc variable += 1.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Il existe également les méthodes succ et pred.

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    La différence avec ces méthodes c'est qu'elles n'affectent pas l'objet, elle renvoie une valeur. Contrairement à l'opérateur ++ (ou l'équivalent ruby += 1) qui lui fait justement une affectation cachée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    num = 4
    puts num.next # => 5
    puts num # => 4
    Et en plus tordu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def test(arg)
      arg += 1 # arg ré-affecté
      puts arg
    end
     
    num = 4
    test(num) # => 5
    puts num # => 4
    On a affecté à une nouvelle valeur à arg, en Ruby c'est à dire une référence vers un nouvel objet contenant 5.
    Mais notre num hors du scope de la fonction référence toujours le même objet qu'avant l'appel de la fonction, objet qui contient 4.

  5. #5
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par ymoreau Voir le message
    L'équivalent est donc variable += 1.
    pas tout à fait, il y'a une subtilité à prendre en compte...

    en C, C++, java et autre il faut faire la distinction entre le ++ (opérateur post incrément) et ++ (opérateur pré incrément) j’admets que cela ne saute pas aux yeux a première vue....

    Pour être plus clair:
    la valeur de retour de l'opérateur pré-incrément est la valeur avant incrémentation alors que le post-incrément est la valeur après incrément.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int x = 1;
     
    int i = x++; // ici 'i' est affecté à 2.
    i = ++x;     // ici 'i' est aussi affecté à 2.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  6. #6
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    @jabbounet :
    Je pense que vous êtes victime d'une confusion chère ami !

    Votre exemple est inversé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int x = 1;
     
    int i = x++; // ici 'i' est affecté à 1 mais x est a 2.
    i = ++x;     // ici 'i' est affecté à 3  et x est a 3.
    pour avoir le résultat que vous avez donné en commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int x = 1;
     
    int i = ++x; // ici 'i' est affecté à 2.
    i = x++;     // ici 'i' est aussi affecté à 2.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Exact, j'ai ajouté l'exemple un peu rapidement sans le relire, le texte précédent quand a lui était correct...

    Citation Envoyé par moi même
    la valeur de retour de l'opérateur pré-incrément est la valeur avant incrémentation alors que le post-incrément est la valeur après incrément.
    merci pour cette correction, cela permet aussi de voir qu'il y'en a qui suivent....
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

Discussions similaires

  1. [XNA] Question bête : où est le designer ?
    Par Daikyo dans le forum XNA/Monogame
    Réponses: 3
    Dernier message: 21/04/2008, 21h38
  2. [C#]Question bête : Comment tester si un objet est créer?
    Par ben_ghost dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/08/2006, 20h50
  3. [POO] Désactiver un objet dont le nom est passé en parametre
    Par JavaEli dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/07/2005, 08h47
  4. [VC++ .NET] mais où est passée SignedXML ???
    Par benoitB dans le forum MFC
    Réponses: 4
    Dernier message: 30/04/2004, 08h14
  5. Numéro auto ===== Question bête
    Par Nicos77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2003, 13h04

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