正如其他人所说,object_id
直接使用可能是更好的方法。
无论如何,沿着这条线的东西可能适用于您的情况:
class Sample
def method(&b)
eval("local_variables.select {|v| eval(v.to_s).object_id == #{object_id}}",
b.binding)
end
end
n1 = Sample.new
n2 = Sample.new
n3 = n2
p n1.method {} #=> [:n1]
p n2.method {} #=> [:n2, :n3]
p Sample.new.method {} #=> []
它返回当前范围内引用被调用对象的所有(局部)变量。如果您的每个对象都被一个变量引用,那么这可能就是您要查找的内容。
Neil Slater 建议:您还可以使用 gem binding_of_caller 来简化绑定转移:
require 'binding_of_caller'
class Sample
def method
binding.of_caller(1).eval(
"local_variables.select {|v| eval(v.to_s).object_id == #{object_id}}"
)
end
end
n1 = Sample.new
n2 = Sample.new
n3 = n2
p n1.method #=> [:n1]
p n2.method #=> [:n2, :n3]
p Sample.new.method #=> []
(使用 gem 的 0.7.2 版测试)。