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

Son*_*tos 1 ruby instance eigenclass

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

我可以通过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!!!!
Run Code Online (Sandbox Code Playgroud)

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

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

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

# (this works for class' eigenclass)
Run Code Online (Sandbox Code Playgroud)

我的用例是我必须得到类方法的类,但是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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Mat*_*ira 5

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

class A; end
class B < A; end

ObjectSpace.each_object(A.singleton_class).to_a
# => [B, A]
Run Code Online (Sandbox Code Playgroud)