によって、クラス A のインスタンスputs A.new.eigenclass.superclass
を効果的に呼び出し#eigenclass
ています。まずバックストーリーから eigenclass が実際にどのように機能するかを説明し、次にコードで何が起こっているかを説明します。
バックストーリー:
EigenClassは、その特定のオブジェクトのみで使用できるシングルトン メソッドを含む隠しクラスです。
の場合obj = Foo.new
、クラス階層は実際には次のようになります。
obj --eigenclass--> #> --(スーパークラス)--> A
それ以外の:
obj --(クラス)--> A
で自己を乗っ取った後、隠しクラスを作成できます#eigenclass
。
さて、Ruby ではClassはオブジェクトです。これは、 (A の sigleton メソッドが保持されている) の非表示の固有クラスも#eigenclass
表示する必要があることも意味します。A
A --(固有クラス)--> # --(スーパークラス)--> #
代わりに#が表示されている理由A
は、Ruby がクラス、スーパークラス、および固有クラスを非常に美しいパターンで編成しているためです。これは、紛らわしい言葉で引用する代わりに、例で示すことができます。
A.superclass #=> Object
A.eigenclass #=> #<Class: A>
A.eigenclass.superclass #=> #<Class: Object> => Eigenclass of Object
A.eigenclass.superclass == Object.eigenclass #=> true
クラスの固有クラスのスーパークラスは、元のクラスのスーパークラスの固有クラスです。
さて、あなたのケースに来てください:Class.new.eigenclass.superclass
、これは今では自明です。Class.new
は新しい匿名クラス、たとえばB
に対応し、効果的にそれを呼び出しeigenclass.superclass
ています。のスーパークラスB
は Object なので、 B の固有クラスのスーパークラスは のスーパークラスの固有クラスですB
。
例を挙げて説明するために最善を尽くしました。以下のコメントでさらに明確にしてください。それに応じて回答を更新します。補完的 (Pragmatic MR から):
.
上図ではD
から継承していC
ます。(D のスーパークラス) [これD.eigenclass.superclass
は C である] の eigneclass も同様です。現在、C のスーパークラスは Object.. であり、同じロジックです。
よろしく