Realmente no pude encontrar esto en la documentación de Rails, pero parece que 'mattr_accessor' es el corolario del módulo para 'attr_accessor' (getter & setter) en una clase Ruby normal .
P.ej. en una clase
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
P.ej. en un módulo
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
Este método auxiliar lo proporciona ActiveSupport .
ruby-on-rails
ruby
class
module
activesupport
JasonOng
fuente
fuente
mattr_accessor
sería una abreviatura de las variables de instancia de clase@variable
, pero el código fuente parece revelar que en realidad están configurando / leyendo variables de clase. ¿Podría explicar esta diferencia?Aquí está la fuente de
cattr_accessor
Y
Aquí está la fuente de
mattr_accessor
Como puede ver, son prácticamente idénticos.
¿Por qué hay dos versiones diferentes? A veces, desea escribir
cattr_accessor
en un módulo, por lo que puede usarlo para información de configuración como menciona Avdi .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 con los módulos.Además, a veces es posible que desee escribir un método de clase en un módulo, de modo que siempre 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 te permite hacer esto.Sin embargo, en el segundo escenario, su comportamiento es bastante extraño. Observe el siguiente código, particularmente tenga en cuenta los
@@mattr_in_module
bitsfuente
cattr_*
ahora son alias paramattr_*
. Ver lacattr_accessor
fuente