2016-08-05 52 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