Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between mattr_accessor and cattr_accessor in ActiveSupport?

I can't work out from looking through the source what the difference is between the cattr_* and mattr_* methods provided in Class and Module respectively. I read this question: What is mattr_accessor in a Rails module? which gives some details about both methods but doesn't highlight the differences.

So my question is what is the difference between them and why do we need both sets of methods when they are practically identical in the source? Also, which should we use when?

like image 234
tobyclemson Avatar asked Feb 04 '23 06:02

tobyclemson


1 Answers

Module is the superclass of the class Class so if a suitably generic name could be thought of then the methods for defining accessors could be put on Module and it would work for modules and classes. Notice that the follow works:

class Bar
  mattr_accessor :test
end

but

module Foo
  cattr_accessor :test
end

wouldn't work.

Having a c prefix on the methods that should be used inside classes and an m prefix on the methods for use inside modules just helps to make your code a bit clearer.

like image 172
mikej Avatar answered Feb 05 '23 18:02

mikej