Ruby - 有没有办法获取特征类的实例?

Posted

技术标签:

【中文标题】Ruby - 有没有办法获取特征类的实例?【英文标题】:Ruby - Is there a way to get the instance of an eigenclass? 【发布时间】:2012-12-25 07:22:46 【问题描述】:

我正在寻找一种获取特征类实例的方法,因为每个特征类只有一个实例。

我可以通过 ObjectSpace 来测试每个特征类,但我想它很昂贵。

奇怪的是,我必须得到每个对象的特征类来测试匹配,因为is_a? 是不够的:

class A; end
class B < A; end

AA = class << A; self; end

p A.is_a? AA #=> true
p B.is_a? AA #=> true!!!!

我希望有一个 Class#instanceClass#instances 方法来获取类(或特征类)的实例。

最直接的方法是从 eigenclass'inspect 中提取实例,但我想知道我是否可以依赖它:

p AA         #=> #<Class:A>
instance = Object.const_get(AA.inspect.match(/^#<Class:(\w+)>$/)[1])
p instance   #=> A

# (this works for class' eigenclass)

我的用例是我必须获取一个类方法的类,但是Method#owner 给了我特征类,Method#receiver 给了我当前的接收者:

# Continuing previous example
def A.f; end
mtd = B.method(:f)
p mtd.owner     #=> #<Class:A>
p mtd.receiver  #=> B
# I want to obtain A

有什么想法吗?

【问题讨论】:

【参考方案1】:

如果您想查找任何给定类的实例,可以使用ObjectSpace

class A; end
class B < A; end

ObjectSpace.each_object(A.singleton_class).to_a
# => [B, A]

【讨论】:

什么是方法singletonclass @sawa,见Object#singleton_class method documentation。 太棒了。我不知道这种方法存在。现在,我可以使用它了。 很高兴知道singleton_class(顺便说一句,这在 1.8.7 中不起作用,但我总是可以在需要时使用class &lt;&lt; A; self; end)。你的回答表明问题远没有我想象的那么复杂。要获得A,我可以使用ObjectSpace.each_object(A.singleton_class).to_a.last。谢谢! 不会在 jruby 上工作,至少在默认情况下禁用 ObjectSpace

以上是关于Ruby - 有没有办法获取特征类的实例?的主要内容,如果未能解决你的问题,请参考以下文章

获取类的所有实例[重复]

Weka:如何获取测试实例的每个类的概率

有没有办法从 Keras 的自动编码器中获取任何层的特征? [复制]

如何在 Python 中获取实例变量?

如何在Java中获取给定类的数组类?

使用 lambda 在单个实例上重新定义单个 ruby​​ 方法