假设以下代码:
class A
end
a = A.new
As = class << a
self
end
# or:
# As = a.singleton_class
有什么办法可以从中得到a
吗As
?
假设以下代码:
class A
end
a = A.new
As = class << a
self
end
# or:
# As = a.singleton_class
有什么办法可以从中得到a
吗As
?
这里有一个技巧给你:
class A
end
a = A.new
As = a.singleton_class
a2 = ObjectSpace.each_object.select{|obj| obj.singleton_class == As}.first
a2 == a # => true
我认为这很简单:
ObjectSpace.each_object(As).first
# => #<A:0x000000029a7c50>
这只是我的有根据的猜测,所以 YMMV,但我认为“a”需要定义为类变量(即“@@a = A.new”),然后您将拥有适当的访问器方法来返回类实例。
话虽如此,您是否考虑过使用Singleton模块(假设您使用的是 1.9.3)?