簡體   English   中英

Ruby-有沒有一種方法來獲取本征類的實例?

[英]Ruby - Is there a way to get the instance of an 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!!!!

我希望有一個Class#instanceClass#instances方法來獲取一個類(或本征類)的實例。

最直接的方法是從eigenclass's 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

有任何想法嗎?

如果要查找任何給定類的實例,可以使用ObjectSpace

class A; end
class B < A; end

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM