cattr_accessor vs class_attribute

cattr_accessor

class Base
cattr_accessor
:settings

# def self.settings
# @@settings
# end

# def self.settings=(value)
# @@settings = value
# end
end

As variáveis ​​de classe tendem a vagar de classe para classe. @@settingsa variável de classe pode ser exposta por meio da árvore de herança.

class Subclass < Base
end

> Base.settings = 'foo'
> Subclass.settings # => 'foo'
> Subclass.settings = 'bar'
> Base.settings # => 'bar'

class_attribute

class Base
class_attribute
:settings

# def self.settings
# nil
# end

# def self.settings?
# !!settings
# end

# def self.settings=(value)
# # store value in singleton class
# # by redefining `settings` method each time
# end
end

O valor das configurações é herdado por subclasses. As subclasses podem alterar seu próprio valor e não afetarão a classe base.

class Subclass < Base
end

> Base.settings = 'foo'
> Subclass.settings # => 'foo'
> Subclass.settings = 'bar'
> Base.settings # => 'foo'