Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Ruby] Les classes

Y'a un truc que je piges pas...

Sujet résolu
    19 décembre 2006 à 20:11:23

    Salut la compagnie :)

    Je suis le tuto "Apprenez Ruby" de Daniel Carrera (traduit en français) et je rencontre un problème de compréhension au niveau des classes. Voici le code proposé pour créer une classe :

    class Adresse
            attr_accessor :rue
            def initialize 
                    @rue = ""
            end
           
            def rue= (une_rue)
                    @rue = (une_rue)
            end
    end

    adresse = Adresse.new
    adresse.rue = "20 Avenue Jules–Ferry" 

    adresse_ami = Adresse.new 
    adresse_ami.rue = "1 rue de la Paix"

    puts adresse.rue     
    puts adresse_ami.rue 


    Voilà : Mais à quoi sert ce foutu morceau de code ?!

    def rue= (une_rue)
            @rue = (une_rue)
    end


    En plus, quand je l'enlève, le programme se déroule normalement.

    Quelqu'un pourrait-il m'expliquer ? (clairement si possible)

    Merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      19 décembre 2006 à 21:12:28

      probablement pour accepter de modifier "rue" (style delegate en C#)
      • Partager sur Facebook
      • Partager sur Twitter
        19 décembre 2006 à 21:19:40

        Hmm... oui, peut-être... merci ;)

        En tout cas, même l'auteur du tuto ne prend plus la peine de mettre ce code dans ses classes... Cela ne doit pas être super important alors :)

        A+ :)
        • Partager sur Facebook
        • Partager sur Twitter
          19 décembre 2006 à 21:23:42

          C'est un accesseur je crois.
          Et je crois qu'il utilise ensuite attr_reader et writer à la place pour ne plus avoir à écrire cette méthode pour chaque membre.

          (ps: post à prendre avec des pincettes, je ne me rappelle plus du tout du ruby :s )

          edit: je viens de retrouver le tuto en question.

          En fait ton code marche car tu t'es trompé en le recopiant:
          Tu as attr_accessor :rue au lieu de attr_reader :rue

          attr_accessor remplace l'accesseur pour la lecture et pour l'écriture, donc écrire ensuite "def rue= (une_rue)" ne sert plus à rien (sachant qu'il y a déjà un accesseur d'écriture).
          • Partager sur Facebook
          • Partager sur Twitter
            19 décembre 2006 à 21:30:13

            euh, ce bout de code ne sert à rien, sachant que le "attr_accessor" le définie, voila pourquoi si tu l'enlève ça ne change rien.

            En fait:

            class Foo

              # defini automatiquement si "foo" est déclaré avec attr_reader ou attr_accessor
              def foo
                return @foo
              end

              # defini automatiquement si "foo" est déclaré avec attr_writer ou attr_accessor
              def foo=(valeur)
                @foo = valeur
              end
            end
            • Partager sur Facebook
            • Partager sur Twitter
              19 décembre 2006 à 21:36:00

              Okay :)
              Merci beaucoup, voilà mon problème résolu ! ;)

              A la revoyure ! ^^ (hmm... je ne suis pas sûr de l'orthographe...)
              • Partager sur Facebook
              • Partager sur Twitter
                19 décembre 2006 à 23:30:08

                C'est pratique dans certains cas :

                class Foo
                   # ...
                   def foo=(valeur)
                      @foo = valeur if valeur > 0 # par exemple.. pour que @foo soit toujours positif.
                   end
                end

                D'après iPoulet, la solution python est plus belle :) (?) .
                • Partager sur Facebook
                • Partager sur Twitter
                  19 décembre 2006 à 23:38:55

                  En Ocaml c'est mieux :
                  class foo = fun bar_init ->
                  object
                  val bar = if bar_init < 0 then -bar_init else bar_init
                  end
                  let test = new foo 2


                  Ça c'était la version pour qu'on comprenne ce qui se passe (désolé pour la coloration, le SDZ buggue avec les "-" donc je l'ai virée), la vraie c'est :
                  class foo bar_init =
                  object
                        val bar = abs bar_init
                  end
                  let test = new foo 4
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 décembre 2006 à 23:43:06

                    ca serais encore mieu avec des commentaires
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Ruby] Les classes

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown