Разница между Mattr accessor и cattr accessor в ActiveSupport?


Я не могу понять, просматривая источник, в чем разница между cattr_* и mattr_* методами, представленными в классе и модуле соответственно. Я прочитал этот вопрос: Что такое mattr_accessor в модуле Rails? , который дает некоторые подробности об обоих методах, но не подчеркивает различия.

Таким образом, мой вопрос заключается в том, в чем разница между ними и зачем нам нужны оба набора методов, когда они практически идентичны в источнике? Кроме того, что мы должны использовать и когда же?
1 7

1 ответ:

Module является суперклассом класса Class, поэтому если бы можно было придумать подходящее универсальное имя, то методы определения методов доступа можно было бы поместить на Module, и это работало бы для модулей и классов. Обратите внимание, что работает следующее:

class Bar
  mattr_accessor :test
end

Но

module Foo
  cattr_accessor :test
end

Не сработает.

Наличие префикса c Для методов, которые должны использоваться внутри классов, и префикса m Для методов, используемых внутри модулей, просто помогает сделать ваш код немного понятнее.