Rubyで私が持っていると仮定しa = "value"; arr1 = [a, b, c];
ますarr2 = [a, d, e];
私が言うことを可能にするいくつかのリフレクティブプログラミングテクニックはありますか:
への参照を持つすべてのオブジェクトは何
a.object_id
ですか?
そして次のような答えを得る:
object_id:123123 (配列)
object_id:234234 (配列)
Rubyで私が持っていると仮定しa = "value"; arr1 = [a, b, c];
ますarr2 = [a, d, e];
私が言うことを可能にするいくつかのリフレクティブプログラミングテクニックはありますか:
への参照を持つすべてのオブジェクトは何
a.object_id
ですか?
そして次のような答えを得る:
object_id:123123 (配列)
object_id:234234 (配列)
ObjectSpace
この種のクエリに一般的に使用されるがあります。上記のコードは、独自のバインディングなどを導入するため、IRB/Pry で大量のガベージ出力を生成することに注意してください。
#!/usr/bin/env ruby
a = 42 ; b,c,g,h = [nil]*4 ; arr1 = [a,b,c] ; arr2 = [g,h,a]
ObjectSpace.each_object(Array) do |arr|
puts "#{arr.__id__}: #{arr.inspect}" if arr.include? a
end
#⇒ 12491500: [nil, nil, 42]
#⇒ 12491520: [42, nil, nil]
このコードには副作用があります。実際には、配列に値によって変数が含まれているかどうかがチェックされます。そうは言っても、plain[42]
も同様にカウントされます。おそらく、より洗練された check を内部で作成することに関心があるでしょうselect
。
しかし、一般的に言えば、「グローバルオブジェクト空間を照会するために何を使用するか」という質問に対する答えは、私の答えの最初にリンクされているものです: ObjectSpace
.