Что такое 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.

831   2  

2 ответов:

Rails расширяет Ruby с обоими mattr_accessor (модуль доступа) и cattr_accessor (а также _reader/_writer версий). Как Руби attr_accessor генерирует методы getter / setter для экземпляров,cattr/mattr_accessor предоставьте методы getter / setter в класс или модуль

вот источник 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"

Comments

    Ничего не найдено.