是否可以使用Ruby反射来检索包含对某些" var.object_id"?的引用的所有对象?

时间:2016-05-13 04:37:28

标签: ruby reflection objectspace

假设在Ruby中我有a = "value"; arr1 = [a, b, c];arr2 = [a, d, e];

是否有一些反思性编程技术允许我说:

  

所有引用a.object_id的对象是什么?

并得到如下答案:

  

object_id:123123(数组)

     

object_id:234234(数组)

1 个答案:

答案 0 :(得分: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