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