ActiveSupport :: Configurable配置对象不会完全克隆

时间:2016-08-05 22:09:22

标签: ruby-on-rails ruby activesupport

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

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_ids。也许它不是克隆问题。也许这是ActiveSupport :: Configurable魔法工作方式的问题。

1 个答案:

答案 0 :(得分:0)

尝试使用dup功能而不是克隆功能。

module App
  class Config
    include ActiveSupport::Configurable

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

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