Voici le code source pour cattr_accessor
Et
Voici le code source pour mattr_accessor
Comme vous pouvez le voir, ils sont à peu près identiques.
Pourquoi il y a deux versions différentes? Parfois, vous voulez écrire cattr_accessor
dans un module, de sorte que vous pouvez l'utiliser pour la configuration de l'info comme Avdi mentionne.
Toutefois, cattr_accessor
ne fonctionne pas dans un module, de sorte qu'ils ont plus ou moins copié le code de travail pour les modules aussi.
En outre, parfois, vous pourriez écrire une méthode de classe dans un module, de sorte que lorsque toute la classe comprend le module, il obtient la méthode de la classe ainsi que toutes les méthodes d'instance. mattr_accessor
vous permet également de faire cela.
Cependant, dans le deuxième scénario, c'est un comportement est assez étrange. Observer le code suivant, en particulier la note de l' @@mattr_in_module
bits
module MyModule
mattr_accessor :mattr_in_module
end
class MyClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # directly access the class variable
end
MyModule.mattr_in_module = 'foo' # set it on the module
=> "foo"
MyClass.get_mattr # get it out of the class
=> "foo"
class SecondClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # again directly access the class variable in a different class
end
SecondClass.get_mattr # get it out of the OTHER class
=> "foo"