複数のキー(1〜5と言うことができます)が1つのオブジェクトを指している(ハッシュを呼び出す)ハッシュがあります。 キー(6-10)は別のオブジェクト(例:b)を指します。値をマージした後に複数のハッシュキーを更新する
ある時点で、 "b"を "a"にマージしました。誰もが同じオブジェクトを見るようにしなければなりません( "a"を "b"にマージし、
手動でキー6-10を更新することなく、 "a"にリダイレクトするだけで "b"への参照を作成する方法がありますか?
複数のキー(1〜5と言うことができます)が1つのオブジェクトを指している(ハッシュを呼び出す)ハッシュがあります。 キー(6-10)は別のオブジェクト(例:b)を指します。値をマージした後に複数のハッシュキーを更新する
ある時点で、 "b"を "a"にマージしました。誰もが同じオブジェクトを見るようにしなければなりません( "a"を "b"にマージし、
手動でキー6-10を更新することなく、 "a"にリダイレクトするだけで "b"への参照を作成する方法がありますか?
の線に沿って何かを実行します。パフォーマンスが重要でない限り、最も簡単なラッパーはプロキシオブジェクトです。プロキシオブジェクトを展開する必要がないため、プロキシオブジェクトはラップされたオブジェクトと同じように透過的に動作します。
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]、もともと自分自身を指すようになります配列の配列、配列を[含まれています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
「a」を「b」にマージしたり、各キーを更新したりする以外の方法は考えられません。どうしてこれらの制限がありますか? – Gerry
@Gerryをaにbをマージすると、将来のマージに問題が生じる可能性があります。各キーを更新すると指数関数的に実行時間が増え、それを維持しようとしています。O(n) –