我在理解如何克隆/复制使用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_config
和config
对象具有不同的object_ids。也许它不是克隆问题。也许这是ActiveSupport :: Configurable魔法工作方式的问题。
答案 0 :(得分:0)
尝试使用dup功能而不是克隆功能。
module App
class Config
include ActiveSupport::Configurable
def self.remember_config
@previous_config = @config
@config = @config.dup
end
end
end
但是你不能将class用作单例类。