Как заставить массив инициализироваться только при первом вызове функции? - PullRequest
1 голос
/ 05 марта 2012
class Class
  def attr_accessor_with_history(attr_name)
    attr_name = attr_name.to_s
    # make sure it's a string                                                                                                                          
    attr_reader attr_name
    # create the attribute's                                                                                                                           

    attr_reader attr_name+"_history" # create bar_history                                                                                              

    class_eval %Q{

      def #{attr_name}=(val)
        @#{attr_name+"_history"}=[]
        @#{attr_name+"_history"}.push(val)
        @#{attr_name}=val
      end
    }
  end
end

class Foo

  attr_accessor_with_history :bar
end

Я хочу создать метод доступа attr, который бы записывал историю всех записей в массиве, но проблема в class_eval: массив инициализируется каждый раз, поэтому он не содержит старых значений.

какие изменения я должен сделать?

1 Ответ

3 голосов
/ 05 марта 2012

Использование ||=:

@#{attr_name+"_history"} ||= []
...