假设在 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]
也将被计算在内,您可能有兴趣在内部进行更复杂的检查select
。
但一般来说,“用什么来查询全局对象空间”这个问题的答案是在我的答案的开头链接的:ObjectSpace
.