如下所示{ }
,如何查找其类名:
self
我要找的是返回self = #<Class:#<PaymentRequestx::PaymentRequest:0x0000000b2a3400>>
。 PaymentRequestx::PaymentRequest
和self.name (nil)
没有回复正确答案。以下是有关self.class.name (Class)
:
如何检索self
?
答案 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
会返回前面提到或包含的模块列表。