假设在Ruby中我有a = "value"; arr1 = [a, b, c];
和arr2 = [a, d, e];
是否有一些反思性编程技术允许我说:
所有引用
a.object_id
的对象是什么?
并得到如下答案:
object_id:123123(数组)
object_id:234234(数组)
答案 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
。