Here's the source for cattr_accessor
And
Here's the source for mattr_accessor
Jak widać, są prawie identyczne.
Dlaczego są dwie różne wersje? Czasami chcesz napisać cattr_accessor
w module, więc możesz go użyć do informacji o konfiguracji like Avdi mentions.
Jednak cattr_accessor
nie działa w module, więc mniej lub bardziej skopiował kod do pracy dla modułów również.
Dodatkowo, czasami możesz chcieć napisać metodę klasy w module tak, że ilekroć jakakolwiek klasa zawiera moduł, pobiera tę metodę klasy, jak również wszystkie metody instancji. mattr_accessor
również pozwala to zrobić.
Jednak w drugim scenariuszu zachowanie jest dość dziwne. Przestrzegać poniższy kod, szczególnie zwróć uwagę na @@mattr_in_module
bity
module MyModule
mattr_accessor :mattr_in_module
end
class MyClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # directly access the class variable
end
MyModule.mattr_in_module = 'foo' # set it on the module
=> "foo"
MyClass.get_mattr # get it out of the class
=> "foo"
class SecondClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # again directly access the class variable in a different class
end
SecondClass.get_mattr # get it out of the OTHER class
=> "foo"
w twoich przykładach wytłumaczyć, że 'mattr_accessor' byłby krótki dla zmiennych instancji klasy (' @ variable's), ale kod źródłowy wydaje się ujawniać, że są faktycznie ustawia/czyta zmienne klasy. Czy mógłbyś wyjaśnić tę różnicę? – sandre89