Je n'ai pas vraiment trouvé cela dans la documentation de Rails mais il semble que «mattr_accessor» soit le corollaire du module pour «attr_accessor» (getter & setter) dans une classe Ruby normale .
Par exemple. dans une classe
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
Par exemple. dans un module
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
Cette méthode d'assistance est fournie par ActiveSupport .
ruby-on-rails
ruby
class
module
activesupport
JasonOng
la source
la source
mattr_accessor
serait court pour les variables d'instance de classe@variable
, mais le code source semble révéler qu'ils définissent / lisent en fait des variables de classe. Pouvez-vous expliquer cette différence?Voici la source de
cattr_accessor
Et
Voici la source de
mattr_accessor
Comme vous pouvez le voir, ils sont à peu près identiques.
Quant à savoir pourquoi il existe deux versions différentes? Parfois, vous voulez écrire
cattr_accessor
dans un module, vous pouvez donc l'utiliser pour des informations de configuration comme les mentionne Avdi .Cependant,
cattr_accessor
ne fonctionne pas dans un module, ils ont donc plus ou moins copié le code pour travailler également pour les modules.De plus, vous pouvez parfois vouloir écrire une méthode de classe dans un module, de sorte que chaque fois qu'une classe inclut le module, elle obtient cette méthode de classe ainsi que toutes les méthodes d'instance.
mattr_accessor
vous permet également de le faire.Cependant, dans le deuxième scénario, son comportement est assez étrange. Observez le code suivant, notez en particulier les
@@mattr_in_module
bitsla source
cattr_*
sont désormais des alias pourmattr_*
. Voir lacattr_accessor
source