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