Eu realmente não consegui encontrar isso na documentação do Rails, mas parece que 'mattr_accessor' é o corolário do Módulo para 'attr_accessor' (getter & setter) em uma classe Ruby normal .
Por exemplo. em uma aula
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
Por exemplo. em um módulo
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
Este método auxiliar é fornecido pelo ActiveSupport .
ruby-on-rails
ruby
class
module
activesupport
JasonOng
fonte
fonte
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?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
bitsfonte
cattr_*
agora são apelidos paramattr_*
. Veja acattr_accessor
fonte