Here's the source for cattr_accessor
Und
Here's the source for 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 like Avdi mentions verwenden können.
Allerdings funktioniert cattr_accessor
nicht in einem Modul, so dass sie mehr oder weniger den Code kopiert, um auch für Module zu arbeiten.
Manchmal möchten Sie vielleicht auch eine Klassenmethode in einem Modul schreiben, sodass jedes Mal, wenn eine Klasse das Modul enthält, diese Klassenmethode sowie alle Instanzmethoden abgerufen werden. mattr_accessor
können Sie dies auch tun.
Im zweiten Szenario ist das Verhalten jedoch ziemlich seltsam. Beachten Sie den folgenden Code, besonders beachten Sie die @@mattr_in_module
Bits
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"
In Ihren Beispielen erklären Sie, dass 'mattr_accessor' für Klasse Instanzvariablen kurz sein würde (' @ variable's), aber der Quellcode scheint zu zeigen, sie sind Klassenvariablen setzen/lesen. Könnten Sie bitte diesen Unterschied erklären? – sandre89