3

假设以下代码:

class A
end

a = A.new

As = class << a
    self
end

# or:
# As = a.singleton_class

有什么办法可以从中得到aAs

4

4 回答 4

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
于 2012-11-25T15:32:27.733 回答
1

我认为这很简单:

ObjectSpace.each_object(As).first
# => #<A:0x000000029a7c50>
于 2012-11-25T15:47:30.000 回答
0

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

于 2012-12-05T20:55:28.047 回答
0

这只是我的有根据的猜测,所以 YMMV,但我认为“a”需要定义为类变量(即“@@a = A.new”),然后您将拥有适当的访问器方法来返回类实例。

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

于 2012-11-25T15:34:17.393 回答