2

各固有クラスにはインスタンスが 1 つしかないため、固有クラスのインスタンスを取得する方法を探しています。

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#instanceorメソッドがあればいいのにと思います。Class#instances

最も直接的な方法は、固有クラスからインスタンスを抽出する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

何か案は?

4

1 に答える 1

6

特定のクラスのインスタンスを検索する場合は、次を使用できますObjectSpace

class A; end
class B < A; end

ObjectSpace.each_object(A.singleton_class).to_a
# => [B, A]
于 2013-01-10T19:38:56.283 に答える