Возможно ли с помощью отражения Ruby извлечь все объекты, содержащие ссылку на какой-то "var.object_id"?
Допустим, в Ruby у меня есть a = "value"; arr1 = [a, b, c];
а также arr2 = [a, d, e];
Есть ли какая-то рефлексивная техника программирования, позволяющая мне сказать:
Каковы все объекты, которые имеют ссылку на
a.object_id
?
и получить в ответ что-то вроде:
идентификатор_объекта:123123 (Array)
идентификатор_объекта:234234 (массив)
1 ответ
Есть 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]
Этот код имеет побочный эффект: он фактически проверяет, содержит ли массив переменную по значению. Это сказал, ясно [42]
будет учитываться, и вы, вероятно, заинтересованы в проведении более сложной проверки внутри select
,
Но, вообще говоря, ответ на вопрос "что использовать для запроса глобального пространства объектов" связан с тем, что связано в самом начале моего ответа: ObjectSpace
,