2016-08-05 55 views
0

我在理解如何克隆/复制使用ActiveSupport :: Configurable的配置对象时遇到了一些麻烦。我正在使用ActiveSupport :: Configurable模块创建一个简单的配置对象。在一些自动化测试中,我想放置当前的配置,并创建一个具有不同值的新配置对象。我有一个叫做remember_config的方法,它只是做ActiveSupport ::可配置的配置对象不会完全克隆

module App 
    class Config 
    include ActiveSupport::Configurable 

    def self.remember_config 
     @previous_config = @config 
     @config = @config.clone 
    end 
    end 
end 

当我使用它时会出现问题。

App.config.foo = 1 
App.config.foo # Returns 1 
App.previous_config # Returns nil 
App.remember_config 
App.config.foo # Still returns 1 
App.previous_config.foo # eturns 1 
App.config.foo = 2 
App.config.foo # Returns 2 
App.config.previous_config.foo # Also returns 2, but I'd like it to return 1! 

为什么最后一行返回2而不是1? @previous_configconfig对象具有不同的object_id。也许这不是一个克隆问题。也许这是ActiveSupport :: Configurable魔术工作方式的一个问题。

回答

0

尝试使用dup函数,而不是克隆函数。

module App 
    class Config 
    include ActiveSupport::Configurable 

    def self.remember_config 
     @previous_config = @config 
     @config = @config.dup 
    end 
    end 
end 

但是你不能使用class作为单例类。

+0

我试过dup,但它也没有工作。它也看起来像一个deep_dup方法可用,也没有工作。 – CodeSmith

+0

你可以给我发送上述配置的呼叫参数吗?如果什么都不起作用,我们总是可以将它们写入文件或数据库:D –

+0

我最终放弃了'ActiveSupport :: Configurable'并使用常规实例变量。 'ActiveSupport :: Configurable'似乎有一些克隆问题。 – CodeSmith