我想通過元編程跟蹤每個類變量的歷史。我不喜歡問這樣的問題,但花了我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}"
我不相信你應該換你的'%Q'引號的'class_eval'位。 '%Q {...}'評估爲內插字符串。 – mrlee 2012-03-03 17:54:21