188 votes

Variable d'instance: self vs @

J'ai vu un code

 class Person
  def initialize(age)
    @age = age
  end

  def age
    @age
  end

  def age_difference_with(other_person)
    (self.age - other_person.age).abs
  end

protected :age
end
 

Ce que je veux savoir, c'est comment différence entre l'utilisation de @age et self.age dans la méthode age_difference_with.

274voto

Chuck Points 138930

La rédaction @age accéder directement à la variable d'instance, @age. La rédaction self.age indique à l'objet à envoyer le message age, ce qui va généralement de retour à la variable d'instance, @age - mais il pourrait faire un certain nombre d'autres choses en fonction de la façon dont l' age méthode est implémentée dans une sous-classe. Par exemple, vous pourriez avoir un MiddleAgedSocialite de classe qui a toujours des rapports de son âge de 10 ans plus jeune qu'elle ne l'est en réalité. Ou plus concrètement, un PersistentPerson classe peut paresseusement lire des données à partir d'un magasin persistant, cache toutes ses données persistantes dans une table de hachage.

23voto

tvanfosson Points 268301

La différence est qu'elle est d'isoler l'utilisation de la méthode de la mise en œuvre. Si la mise en œuvre de la propriété étaient à changer-dire de garder la date de naissance, puis de calculer l'âge en fonction de la différence de temps entre maintenant et la date de naissance, puis le code en fonction de la méthode n'a pas besoin de changer. Si elle est utilisée directement l'établissement, le changement aurait besoin pour se propager à d'autres zones du code. Dans ce sens, en utilisant directement la propriété est plus fragile que l'utilisation de la classe fournis par l'interface.

1voto

DigitalRoss Points 80400

Il n'y a pas de différence. Je soupçonne qu'il a été fait juste pour la valeur documentaire de voir self.age et other_person.age près les uns des autres.

Je suppose que l'utilisation ne permettent pour un getter pour être écrit dans l'avenir, qui pourraient faire quelque chose de plus complexe que de simplement retourner une variable d'instance, et dans ce cas, la méthode n'aurait pas besoin de changer.

Mais c'est peu probable que l'abstraction de s'inquiéter, après tout, si la mise en œuvre de l'objet a changé, il est raisonnable de le modifier d'autres méthodes, à un certain point, une simple référence à l'intérieur de l'objet lui-même est tout à fait raisonnable.

Dans tous les cas, l'abstraction de l' age de la propriété n'est toujours pas expliquer l'utilisation explicite de self, comme nous venons de plain age aurait également invoqué l'accesseur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X