2015-01-20 1 views
3

Rails имеет расширение класса class_attribute, которое позволяет наследовать переменные экземпляра класса. Это прекрасно работает с неизменяемыми объектами, например. String, но не с mutables:Правильный способ использования `class_attribute` с` Hash`

class Base 
    class_attribute :options 
    self.options = {} 
end 

class SubClass < Base 
end 

Base.options     # {} 
SubClass.options[:foo] = "bar" # { foo: "bar" } 
Base.options     # { foo: "bar" } 

Вопрос заключается в том, чтобы позволить подклассы иметь свою собственную копию options без явного его инициализации в своем теле:

class SubClass < Base 
    self.options = {} 
end 

ответ

2

Хитрость заключается в том, чтобы использовать метод inherited в родительском классе:

class Base 
    class_attribute :options 
    self.options = {} 

    class << self 
    def inherited(subClass) 
     self._options = self._options.clone 
    end 
    end 
end 

это автоматически клонирует параметры родителей каждый раз, когда оно подклассифицировано.

Смежные вопросы