Вот источник для cattr_accessor
А
Вот источник для mattr_accessor
Как видите, они практически идентичны.
Что касается того, почему существуют две разные версии? Иногда вы хотите написать cattr_accessor
в модуле, чтобы вы могли использовать его для информации о конфигурации , как Авди упоминает .
Однако cattr_accessor
не работает в модуле, поэтому они более или менее скопировали код для работы и для модулей.
Кроме того, иногда вам может понадобиться написать метод класса в модуле, чтобы всякий раз, когда любой класс включал модуль, он получал этот метод класса, а также все методы экземпляра. mattr_accessor
также позволяет вам сделать это.
Однако во втором сценарии это поведение довольно странное. Соблюдайте следующий код, особенно обратите внимание на @@mattr_in_module
бит
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"