各固有クラスにはインスタンスが 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#instance
orメソッドがあればいいのにと思います。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
何か案は?