2016-08-31 5 views
2

해시가 포함되어있는 이있는 (비트 사용자 지정) 싱글 톤이 있습니다.Ruby에서 Singleton의 인스턴스 변수의 복제 된 값을 얻는 방법은 무엇입니까?

이 데이터를 가져오고 거기에 특정 값을 추가하고 싶습니다. 내가 변수로 데이터를 설정할 때 는하지만, 그 변수는 링크를 포함 된 데이터에가 아닌 을 복사 밝혀졌습니다.

내 '싱글'의 코드 업데이트]

:

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 :... 내가하지 datainstance에 이러한 방법을 사용하려고했습니다 나에게 대답 내 잘못 모두에게 감사)

답변

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있는 모든 기능을 단일있다.

관련 문제