gpt4 book ai didi

ruby-on-rails - 如何在 Ruby 中获取单例实例变量的克隆值?

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:45 25 4
gpt4 key购买 nike

我有一些(有点自定义的)单例,它有 attr_reader :data,其中包含哈希。

我想获取此数据,有时会在其中添加特定值。但是当我将数据设置为变量时,事实证明,该变量包含数据的link,而不是copy .

已更新我的“单例”代码:

class Company
FILE_PATH = "#{Rails.root}/config/company.yml"
attr_reader :data
def self.instance
@instance ||= new
end

def self.path
FILE_PATH
end

def save data
File.open(FILE_PATH, 'w') { |file| file.write(data.to_yaml) }
set_data
end

private
def initialize
set_data
end

def set_data
@data = HashWithIndifferentAccess.new(YAML.load(File.read(FILE_PATH)))
end
end

使用示例:

Company.instance.data[:bar]
=> nil
foo = Company.instance.data
foo[:bar] = 'buzz'
Company.instance.data[:bar]
=> 'buzz'

如何将数据副本放入变量?我试过 .dup.copy,但没有用。

(UPD:我试过在实例上使用这些方法,而不是在数据上。我的错。谢谢大家,谁回答对我来说。)

最佳答案

我尝试过使用 .clone.dup,它们似乎都适合我。

require 'singleton'

class MySingleton
include Singleton
attr_accessor :data
end

MySingleton.instance.data = {}
foo = MySingleton.instance.data
foo[:bar] = 'buzz'
puts foo # {:bar=>"buzz"}
puts MySingleton.instance.data # {:bar=>"buzz"}

MySingleton.instance.data = {}
foo = MySingleton.instance.data.dup # or .clone
foo[:bar] = 'buzz'
puts foo # {:bar=>"buzz"}
puts MySingleton.instance.data # {}

关于ruby-on-rails - 如何在 Ruby 中获取单例实例变量的克隆值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39246459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com