给定一个self如下,如何找到它的类名:
self
self = #<Class:#<PaymentRequestx::PaymentRequest:0x0000000b2a3400>>
我想要的是返回PaymentRequestx::PaymentRequest。self.name (nil)和self.class.name (Class)不会返回正确答案。以下是有关self的更多信息:
PaymentRequestx::PaymentRequest
self.name (nil)
self.class.name (Class)
如何检索PaymentRequestx::PaymentRequest?
xfb7svmp1#
如果你想得到一个单例类的唯一示例,你可以在ObjectSpace中找到它。
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
bvjxkvbb2#
检查表格:
#<Class:#<SomeModule>>
表示SomeModule的单例类。当SomeModule实际上是一个模块的匿名示例时,它看起来像这样:
SomeModule
a = Module.new # => #<Module:0x007f6f86eb8fa0> a.singleton_class # => #<Class:#<Module:0x007f6f86eb8fa0>>
您有一个匿名类,它是PaymentRequestx::PaymentRequest的匿名示例0x0000000b2a3400的单例类,它必须是一个模块。你不能命名一个单例类,所以你不能得到它的名字。在获取一个单例类的原始模块时,按照here提供的答案进行操作。
0x0000000b2a3400
xa9qqrwz3#
试试self.ancestors.first.name:ancestors返回一个模块的列表,这些模块被添加或包含在它被调用的对象中。
self.ancestors.first.name
:ancestors
3条答案
按热度按时间xfb7svmp1#
如果你想得到一个单例类的唯一示例,你可以在
ObjectSpace
中找到它。如果您的
self
是一个类的单例类,那么您正在搜索的类就是该单例类的唯一示例。这种方法可能不快,所以尽可能避免使用它。
警告:如果你想要的类有子类,那么这种方法将不起作用。举个例子
将返回大量的类(想想为什么)。
更新
您可以从
ObjectSpace
的搜索结果中进行进一步筛选。bvjxkvbb2#
检查表格:
表示
SomeModule
的单例类。当SomeModule
实际上是一个模块的匿名示例时,它看起来像这样:您有一个匿名类,它是
PaymentRequestx::PaymentRequest
的匿名示例0x0000000b2a3400
的单例类,它必须是一个模块。你不能命名一个单例类,所以你不能得到它的名字。在获取一个单例类的原始模块时,按照here提供的答案进行操作。
xa9qqrwz3#
试试
self.ancestors.first.name
:ancestors
返回一个模块的列表,这些模块被添加或包含在它被调用的对象中。