Возможно ли с помощью отражения 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,

Другие вопросы по тегам