如何获取Ruby中给定的单例(或特征)类对应的对象?

时间:2012-11-25 15:24:29

标签: ruby eigenclass

假设以下代码:

class A
end

a = A.new

As = class << a
    self
end

# or:
# As = a.singleton_class

有没有办法从a获取As

4 个答案:

答案 0 :(得分:3)

这是给你的一招:

class A
end

a = A.new

As = a.singleton_class

a2 = ObjectSpace.each_object.select{|obj| obj.singleton_class == As}.first

a2 == a # => true

答案 1 :(得分:1)

我认为这很简单:

ObjectSpace.each_object(As).first
# => #<A:0x000000029a7c50>

答案 2 :(得分:0)

这只是我自己对YMMV的猜测,但我认为“a”需要被定义为一个类变量(即“@@ a = A.new”)然后你会有适当的访问方法返回类实例。

话虽如此,您是否考虑过使用Singleton模块(假设您使用的是1.9.3)?

答案 3 :(得分:0)

sawa的解决方案不适用于类的本征类。可以通过Object#to_sModule#to_s方法获得通用方法,通过解析返回的字符串,请参阅atalon.cz。但是,这个解决方案不是100%可靠,因为在Ruby中,可以重新分配/删除常量。