Что такое Mattr accessor в модуле Rails?
Я не мог найти это в документации Rails, но похоже, что 'mattr_accessor' - это модуль следствие для 'attr_accessor' (getter & setter) в обычном Ruby класс.
например. в классе
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
например. в модуле
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
этот вспомогательный метод обеспечивается ActiveSupport.
2 ответов:
Rails расширяет Ruby с обоими
mattr_accessor(модуль доступа) иcattr_accessor(а также _reader/_writerверсий). Как Рубиattr_accessorгенерирует методы getter / setter для экземпляров,cattr/mattr_accessorпредоставьте методы getter / setter в класс или модуль
и
как вы можете видеть, что они практически идентичны.
почему существуют две разные версии? Иногда хочется написать
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"
Comments