4

まず、 「このブログ投稿からコピーした」固有クラスを取得するメソッドを追加しましょう。

class Object 
  def eigenclass 
    class << self
      self
    end 
  end 
end

次に、簡単なクラスを作成します

class A
end

puts A.new.eigenclass.superclass      # => A
puts Class.new.eigenclass.superclass  # => #<Class:Object>

出力クラスへの2回目のプットを期待していました

なぜこれが起こったのか手がかりはありますか?

4

3 に答える 3

5

によって、クラス 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 から): Pragmatic MR からのショット.

上図ではDから継承していCます。(D のスーパークラス) [これD.eigenclass.superclassは C である] の eigneclass も同様です。現在、C のスーパークラスは Object.. であり、同じロジックです。

よろしく

于 2014-06-04T00:03:50.643 に答える
1

クラスの固有クラスには、すべてが固有クラスとクラスの間を移動するクラスの祖先の固有クラスのシャドウ階層全体があります。これは、クラスが祖先のクラス メソッドを継承することが期待されているためです。たとえば、 を実行した場合、true であるdef Numeric.kind_of_number?() true endことが期待Fixnum.kind_of_number?されます。したがって、Numeric の固有クラスを Fixnum の固有クラスの祖先として持つ必要があります。

于 2014-06-03T22:39:09.363 に答える