10

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?

Community
  • 1
  • 1
tobyclemson
  • 317
  • 4
  • 12

1 Answers1

13

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.

mikej
  • 65,295
  • 17
  • 152
  • 131
  • So functionally they are completely equivalent? Also, this makes me wonder why they haven't been DRYed up in the Rails source as the method bodies are identical... – tobyclemson Feb 05 '10 at 13:36