添加方法调用setter(序列化)
问题描述:
我有几个类被序列化到一个文件与YAML。为了序列化时,它的属性变化,我已经实现自定义的制定者为他们每个人:添加方法调用setter(序列化)
def serialize
File.open(@inipath, 'w') do |file|
file << YAML.dump(self)
end
end
def numbering=(value)
@numbering = value
serialize
end
def savepath=(value)
@savepath = value
serialize
end
def active=(value)
@active = value
serialize
end
...
可这不重复做什么?
答
我可能会在这里使用一些元编程秘密酱。
这里的酱:
module OptInSerialization
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def serialize_on_changes_in(*names)
names.each do |name|
alias_method "old_#{name}=", "#{name}="
define_method "#{name}=" do |val|
send("old_#{name}=", val)
serialize
end
end
end
end
end
这里是你如何使用它:
注意的是,这里的序列不被分配给there
触发,因为你没有指定。
声明:此MP魔法可能会超出您当前的级别,所以如果您不理解它,请不要使用它。
答
这里ClassName是模型的名称,column_names会给你模型的所有列。
ClassName.column_names.each do |type|
define_method("#{type}=(value)") do
eval"@#{type}"
instance_variable_set("@#{type}",value)
serialize
end
def column_names
['numbering','savepath']
end
我不使用Rails,而是一个纯ruby类。 – Sven
您可以创建一个方法column_names,它将返回所需的任何setter。 –