Aqui está a fonte para cattr_accessor
E
Aqui está a fonte para mattr_accessor
Como você pode ver, eles são praticamente idênticos.
Por que existem duas versões diferentes? Às vezes você deseja escrever cattr_accessor
em um módulo, então você pode usá-lo para informações de configuração, como o Avdi menciona .
No entanto, cattr_accessor
não funciona em um módulo, então eles mais ou menos copiaram o código para funcionar também em módulos.
Além disso, às vezes você pode querer escrever um método de classe em um módulo, de forma que sempre que qualquer classe incluir o módulo, ela obtenha esse método de classe, bem como todos os métodos de instância. mattr_accessor
também permite que você faça isso.
Porém, no segundo cenário, seu comportamento é bastante estranho. Observe o código a seguir, especialmente os @@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"
mattr_accessor
seria uma abreviação de variáveis de instância de classe@variable
, mas o código-fonte parece revelar que eles estão, na verdade, configurando / lendo variáveis de classe. Você poderia explicar essa diferença?