Я пытаюсь отслеживать историю каждой переменной класса с помощью метапрограммирования.Я не фанат задавать такие вопросы, но у меня ушло 5 часов, чтобы написать их, и отныне я понятия не имею, как поступить (я новичок в ruby, и я впервыеиграю с метапрограммированием).
В моем понимании;когда attr_accessor_with_history
инициализируется в классе, он должен выполнить код, который он содержит.Таким образом, каждый раз, когда этот метод инициализируется, благодаря достоинствам метапрограммирования у каждого класса будет свой собственный метод для описанной мной проблемы.
В представленном мной коде читатели инициализируются правильно, но я не могу сказать,то же самое с кодом в class_eval
части.Мне нужно уточнить, почему код не работает, и метапрограммирование в целом.
class Class
def attr_accessor_with_history(attr_name)
attr_name = attr_name.to_s
attr_reader attr_name
attr_reader attr_name + "_history"
class_eval "%Q{
@#{attr_name}_history=[nil]
def #{attr_name}=(value)
#{attr_name}=value
#{attr_name}_history.push(value)
end
}
"
end
end
class Klass
attr_accessor_with_history :kamil
def initialize(value)
kamil = value
end
end
a = Klass.new(5)
a.kamil = 1
puts "#{a.kamil_history}"