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{
def #{attr_name}=(new_value)
@#{attr_name}_history = [nil] if @#{attr_name}_history.nil?
@#{attr_name}_history << @#{attr_name} = new_value
end
}
end
end
class Example
attr_accessor_with_history :foo
attr_accessor_with_history :bar
end
Class.attr_accessor_with_history
と同じ機能を提供するattr_accessor
だけでなく、属性がこれまでに持っていたすべての値を追跡するメソッドがあります。
> a = Example.new; a.foo = 2; a.foo = "test"; a.foo_history
=> [nil, 2, "test"]
しかし、
> a = Example.new; a.foo_history
=> nil
そしてそれはあるべきです[nil
。
各値が次のように初期化されるクラスに
単一のinitialize
メソッドを定義するにはどうすればよいですか?Example
…_history
[nil]