2016-08-31 4 views
2

私はハッシュを含むを持つシングルトン(ビットカスタム)をいくつか持っています。RubyでSingletonのインスタンス変数のクローン値を取得する方法は?

このデータを取得したい場合や、特定の値を追加する場合があります。 私は変数にデータを設定する場合でも、それが判明し、その変数は、リンクデータの、ないコピーが含まれています。

私の 'シングルトン' の コードUPDATED

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:。。。私はないdataに、instanceにこれらのメソッドを使用しようとした私のせいで私に答えたみんなありがとうを、)

答えて

1

私はあなたが何かを混同していると思います。

class MySingleton 
    include Singleton 
    attr_reader :data 

    def initialize 
    @data = {a: 1, b: 2} 
    end 
end 

foo = MySingleton.instance.data.clone 
#=> {:a=>1, :b=>2} 
foo[:c] = 3 
#=> 3 
foo 
#=> {:a=>1, :b=>2, :c=>3} 
MySingleton.instance.data 
#=> {:a=>1, :b=>2} 
+0

'attr_reader:data'は冗長です。 – Aetherus

+0

あなたはそうです。たぶん私は十分な情報を与えなかった、私はもう少し複雑なケースを持っている。 –

+0

@Aetherusあなたは正しいです、ありがとう! –

2

私は.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 # {} 
0

ルービックのシングルトンパターンの概念は、時間とともに変化しています。明示的なシングルトンクラスを実装するためにinclude Singletonを使用することは、フリンジプラクティスになりました。通常は、例えばオブジェクトを作成します。このように、そのシングルトンクラスObject.new.singleton_classObject.newと仕事を呼び出すことにより:

o = Object.new 
class << o 
    attr_reader :data 
end 

をそして、あなたはカスタムセレクター#dataで完全に機能シングルトンを持っています。

関連する問題