ruby 如何找到一个单例类的 Package 类名?

pgx2nnw8  于 2023-05-28  发布在  Ruby
关注(0)|答案(3)|浏览(78)

给定一个self如下,如何找到它的类名:

self = #<Class:#<PaymentRequestx::PaymentRequest:0x0000000b2a3400>>

我想要的是返回PaymentRequestx::PaymentRequestself.name (nil)self.class.name (Class)不会返回正确答案。以下是有关self的更多信息:

如何检索PaymentRequestx::PaymentRequest

xfb7svmp

xfb7svmp1#

如果你想得到一个单例类的唯一示例,你可以在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
bvjxkvbb

bvjxkvbb2#

检查表格:

#<Class:#<SomeModule>>

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

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

您有一个匿名类,它是PaymentRequestx::PaymentRequest的匿名示例0x0000000b2a3400的单例类,它必须是一个模块。你不能命名一个单例类,所以你不能得到它的名字。
在获取一个单例类的原始模块时,按照here提供的答案进行操作。

xa9qqrwz

xa9qqrwz3#

试试self.ancestors.first.name
:ancestors返回一个模块的列表,这些模块被添加或包含在它被调用的对象中。

相关问题