2010-05-01 7 views
5

Je travaille sur un livre sur Ruby, et l'auteur a utilisé une forme légèrement différente pour écrire une définition d'initialisation de classe que dans les sections précédentes du livre. Il ressemble à ceci:Quelle est la différence entre ces deux définitions d'initialisation de classe Ruby?

class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    self.venue = venue 
    self.date = date 
    end 
end 

Dans les sections précédentes du livre, il aurait été défini comme ceci:

class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    @venue = venue 
    @date = date 
    end 
end 

est-il une différence fonctionnelle entre l'utilisation de la méthode setter, comme dans le premier exemple, vs en utilisant la variable d'instance comme dans la seconde? Ils semblent tous les deux travailler. Même les mélanger travaux:

class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    @venue = venue 
    self.date = date 
    end 
end 
+0

+1 pour ne pas avoir programmé par coïncidence. –

Répondre

9

Puisque la méthode setter a été défini par attr_accessor et donc ne rien mettre la variable, il n'y a pas de différence entre l'utilisation de la méthode setter et la définition directe de la variable. Le seul avantage de l'utilisation de la méthode setter est que si vous changez la méthode setter pour faire autre chose que de définir la variable (comme valider l'entrée ou enregistrer quelque chose), votre méthode initialize sera affectée par ces changements sans tu dois le changer.

+0

+1 J'ai trouvé que la notification de changement n'est pas possible (ou est difficile et non documentée) avec '@ lieu', seulement avec' self.venue'. Si quelqu'un connaît un moyen d'observer les setters basés sur les attributs, faites le moi savoir;) –

Questions connexes