Ich konnte nicht wirklich diese Dokumentation in Rails finden , aber es scheint , wie ‚mattr_accessor‘ ist das Modul logische Folge für ‚attr_accessor‘ (Getter & Setter) in einer normalen Ruby - Klasse .
Z.B. in einer Klasse
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
Z.B. in einem Modul
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
Diese Hilfsmethode wird von ActiveSupport bereitgestellt .
ruby-on-rails
ruby
class
module
activesupport
JasonOng
quelle
quelle
mattr_accessor
dies für Klasseninstanzvariablen kurz ist@variable
, aber der Quellcode scheint zu zeigen, dass sie tatsächlich Klassenvariablen setzen / lesen. Könnten Sie bitte diesen Unterschied erklären?Hier ist die Quelle für
cattr_accessor
Und
Hier ist die Quelle für
mattr_accessor
Wie Sie sehen können, sind sie ziemlich identisch.
Warum gibt es zwei verschiedene Versionen? Manchmal möchten Sie
cattr_accessor
in ein Modul schreiben , damit Sie es für Konfigurationsinformationen wie Avdi-Erwähnungen verwenden können .Funktioniert jedoch
cattr_accessor
nicht in einem Modul, sodass der Code mehr oder weniger kopiert wurde, um auch für Module zu funktionieren.Außerdem möchten Sie manchmal eine Klassenmethode in ein Modul schreiben, sodass jedes Mal, wenn eine Klasse das Modul enthält, diese Klassenmethode sowie alle Instanzmethoden abgerufen werden.
mattr_accessor
Sie können dies auch tun.Im zweiten Szenario ist das Verhalten jedoch ziemlich seltsam. Beachten Sie den folgenden Code, insbesondere die
@@mattr_in_module
Bitsquelle
cattr_*
sind jetzt Aliase fürmattr_*
. Siehe diecattr_accessor
Quelle