添加方法调用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 
+0

我不使用Rails,而是一个纯ruby类。 – Sven

+0

您可以创建一个方法column_names,它将返回所需的任何setter。 –