如何找到单例类的包装类名?

时间:2016-04-14 01:07:51

标签: ruby

如下所示{ } ,如何查找其类名:

self

我要找的是返回self = #<Class:#<PaymentRequestx::PaymentRequest:0x0000000b2a3400>> PaymentRequestx::PaymentRequestself.name (nil)没有回复正确答案。以下是有关self.class.name (Class)

的更多信息

enter image description here

如何检索self

3 个答案:

答案 0 :(得分:1)

检查表格:

#<Class:#<SomeModule>>

表示SomeModule的单例类。当SomeModule实际上是模块的匿名实例时,它看起来像这样:

a = Module.new
# => #<Module:0x007f6f86eb8fa0>
a.singleton_class
# => #<Class:#<Module:0x007f6f86eb8fa0>>

您有一个匿名类,它是0x0000000b2a3400的匿名实例PaymentRequestx::PaymentRequest的单例类,它必须是一个模块。你不能命名一个单例类,所以你不能得到它的名字。

在获取单身人士课程的原始模块后,请按照here提供的答案。

答案 1 :(得分:1)

如果您想获得单例类的唯一实例,可以在ObjectSpace中找到它。

some_singleton_class = some_obj.singleton_class

some_obj_2 = ObjectSpace.each_object(some_singleton_class).first

some_obj_2.object_id == some_obj.object_id  #=> true

如果你的self是一个类的单例类,那么你要搜索的类就是该单例类的唯一实例。

ObjectSpace.each_object(self).first.name  #=> should return "PaymentRequestx::PaymentRequest"

这种方法可能不会很快,所以尽量避免使用它。

警告:如果您想要的类具有子类,则此方法将不起作用。例如

ObjectSpace.each_object(Object.singleton_class).to_a

会返回大量的课程(想想为什么)。

更新

您可以从ObjectSpace的搜索结果中进一步过滤。

def instance_of(singleton_class)
  ObjectSpace.each_object(singleton_class).find do |obj|
    obj.singleton_class == singleton_class
  end
end

instance_of(Object.singleton_class)  #=> Object

答案 2 :(得分:-1)

尝试self.ancestors.first.name

:ancestors会返回前面提到或包含的模块列表。