2017-07-20 10 views
0

複数のキー(1〜5と言うことができます)が1つのオブジェクトを指している(ハッシュを呼び出す)ハッシュがあります。 キー(6-10)は別のオブジェクト(例:b)を指します。値をマージした後に複数のハッシュキーを更新する

ある時点で、 "b"を "a"にマージしました。誰もが同じオブジェクトを見るようにしなければなりません( "a"を "b"にマージし、

手動でキー6-10を更新することなく、 "a"にリダイレクトするだけで "b"への参照を作成する方法がありますか?

+0

「a」を「b」にマージしたり、各キーを更新したりする以外の方法は考えられません。どうしてこれらの制限がありますか? – Gerry

+0

@Gerryをaにbをマージすると、将来のマージに問題が生じる可能性があります。各キーを更新すると指数関数的に実行時間が増え、それを維持しようとしています。O(n) –

答えて

2

の線に沿って何かを実行します。パフォーマンスが重要でない限り、最も簡単なラッパーはプロキシオブジェクトです。プロキシオブジェクトを展開する必要がないため、プロキシオブジェクトはラップされたオブジェクトと同じように透過的に動作します。

class ProxyObject 
    # thanks to https://alisdair.mcdiarmid.org/invisible-proxies-with-ruby/ 
    instance_methods.each do |m| 
    undef_method(m) unless m =~ /(^__|^nil\?$|^send$|^object_id$)/ 
    end 

    attr_accessor :target 

    def initialize(target) 
    @target = target 
    end 

    def respond_to?(symbol, include_priv=false) 
    @target.respond_to?(symbol, include_priv) 
    end 

    private def method_missing(method, *args, &block) 
    @target.send(method, *args, &block) 
    end 
end 

a = 1 
b = 10 
a_proxy = ProxyObject.new(a) 
b_proxy = ProxyObject.new(b) 
a_proxy.class     # verify how well they masquerade 
# => Integer 
hash = 10.times.map { |i| [i + 1, i < 5 ? a_proxy : b_proxy] }.to_h 
# => {1=>1, 2=>1, 3=>1, 4=>1, 5=>1, 6=>10, 7=>10, 8=>10, 9=>10, 10=>10} 
hash.values.sum()    # confirm it behaves exactly like a number 
# => 55 
b_proxy.target = a_proxy.target # switch reference 
hash 
# => {1=>1, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1, 9=>1, 10=>1} 
hash.values.sum()    # confirm the reference is changed 
# => 10 
+0

これは完璧です。ありがとう –

0

が、私は答えを見つけたと思うが、私はまだオブジェクトを持つハッシュのではなく、それを

をコーディングする必要があり、それは

は、[0]、もともと自分自身を指すようになります配列の配列、配列を[含まれていますARR2をマージした後、[0]

自体とARR1に[0]点hash1-5 ARR1する点、ARR2にhash6-10点、ARR1:1]ので、これは設定され、実際のオブジェクト

あろう[1](元の質問のb)をarr1 [1]に変換する私はarr2 [0]をarr1を指すように更新します。

最後に、すべてのキー検索した後、私はあなたがラッパーのいくつかの種類を持っていない限り、あなたは別のもののオブジェクトを切り替えることはできません

test = hash[6] while test[0] != test test = test[0] end

関連する問題