1

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

是否有一些反射性编程技术可以让我说:

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

并得到类似的答案:

object_id:123123 (数组)

object_id:234234(数组)

4

1 回答 1

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]

这段代码有一个副作用:它实际上检查数组是否包含变量。也就是说,plain[42]也将被计算在内,您可能有兴趣在内部进行更复杂的检查select

但一般来说,“用什么来查询全局对象空间”这个问题的答案是在我的答案的开头链接的:ObjectSpace.

于 2016-05-13T04:51:23.383 回答