Qu'est-ce que mattr_accessor dans un Rails de module?
Je ne pouvais pas vraiment trouver cela dans les Rails de la documentation, mais il semble comme 'mattr_accessor' est le Module corollaire pour 'attr_accessor' (getter et setter) dans des conditions normales Ruby classe.
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.
Vous devez vous connecter pour publier un commentaire.
Rails s'étend Ruby avec les deux
mattr_accessor
(Module d'accesseur) etcattr_accessor
(ainsi que d' _reader
/_writer
versions). Comme Rubyattr_accessor
génère des getter/setter pour instances,cattr/mattr_accessor
fournir des getter/setter à la classe ou module niveau. Donc:est l'abréviation de:
Les deux versions vous permettent d'accéder au module de variables au niveau de la sorte:
mattr_accessor
sera de courte durée pour la classe des variables d'instance (@variable
s), mais le code source semble révéler qu'ils sont réellement réglage lecture/variables de classe. Pourriez-vous nous expliquer cette différence?Voici le code source pour
cattr_accessor
Et
Voici le code source pour
mattr_accessor
Comme vous pouvez le voir, ils sont à peu près identiques.
Pourquoi il existe deux versions différentes? Parfois, vous voulez écrire
cattr_accessor
dans un module, de sorte que vous pouvez l'utiliser pour la configuration de l'info comme le mentionne Avdi.Cependant,
cattr_accessor
ne fonctionne pas dans un module, de sorte qu'ils ont plus ou moins copié le code de travail pour les modules aussi.En outre, parfois, vous pourriez écrire une méthode de classe dans un module, de sorte que lorsque toute la classe comprend le module, il obtient la méthode de la classe ainsi que toutes les méthodes d'instance.
mattr_accessor
vous permet également de faire cela.Cependant, dans le deuxième scénario, c'est un comportement est assez étrange. Observer le code suivant, en particulier la note la
@@mattr_in_module
bitscattr_*
sont maintenant des alias pour lesmattr_*
. Voir lecattr_accessor
source