Here's the source for cattr_accessor
Y
Here's the source for mattr_accessor
Como puede ver, son prácticamente idénticos.
¿Por qué hay dos versiones diferentes? Algunas veces desea escribir cattr_accessor
en un módulo, de modo que puede usarlo para la información de configuración like Avdi mentions.
Sin embargo, cattr_accessor
no funciona en un módulo, por lo que más o menos copiaron el código para que funcione también para los módulos.
Además, a veces es posible que desee escribir un método de clase en un módulo, de modo que cada vez que una clase incluya el módulo, obtenga ese método de clase así como todos los métodos de instancia. mattr_accessor
también le permite hacer esto.
Sin embargo, en el segundo escenario, su comportamiento es bastante extraño. Observe el siguiente código, sobre todo en cuenta los bits de @@mattr_in_module
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"
En sus ejemplos, se explica que 'mattr_accessor' sería la abreviatura de las variables de instancia de clase (' @ variable's), pero el código fuente parece revelar que son en realidad está configurando/leyendo variables de clase. ¿Podría explicar esta diferencia? – sandre89