Nie mogłem znaleźć tego w dokumentacji Railsów, ale wygląda na to, że 'mattr_accessor' jest następstwem modułu 'attr_accessor' (getter & setter) w normalnej klasie Ruby .
Na przykład. w klasie
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
Na przykład. w module
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
Ta metoda pomocnicza jest udostępniana przez ActiveSupport .
ruby-on-rails
ruby
class
module
activesupport
JasonOng
źródło
źródło
mattr_accessor
byłoby to skrótem od zmiennych instancji klasy@variable
, ale kod źródłowy wydaje się ujawniać, że w rzeczywistości ustawiają / odczytują zmienne klas. Czy mógłbyś wyjaśnić tę różnicę?Oto źródło
cattr_accessor
I
Oto źródło
mattr_accessor
Jak widać, są prawie identyczne.
Dlaczego istnieją dwie różne wersje? Czasami chcesz pisać
cattr_accessor
w module, więc możesz go użyć do informacji konfiguracyjnych, takich jak wspomina Avdi .Jednak
cattr_accessor
nie działa w module, więc mniej więcej skopiowali kod, aby również pracować dla modułów.Ponadto czasami możesz chcieć napisać metodę klasy w module, tak że za każdym razem, gdy jakakolwiek klasa zawiera moduł, pobiera tę metodę klasy, jak również wszystkie metody instancji.
mattr_accessor
również na to pozwala.Jednak w drugim scenariuszu jego zachowanie jest dość dziwne. Przestrzegaj poniższego kodu, szczególnie zwracaj uwagę na
@@mattr_in_module
bityźródło
cattr_*
są teraz aliasy dlamattr_*
. Zobaczcattr_accessor
źródło