我正在寻找一种获取特征类实例的方法,因为每个特征类只有一个实例。
我可以通过 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
或Class#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
有任何想法吗?