Ось джерело для 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"
mattr_accessor
змінні (@variable
-и) екземплярів класу можуть бути короткими , але, схоже, вихідний код показує, що вони насправді встановлюють / читають змінні класу. Не могли б ви пояснити цю різницю?