オブジェクトまたはクラスでシングルトン メソッドが定義される前に固有クラスが存在しますか。つまり、シングルトンメソッドまたはクラスメソッドが定義されている場合、それらは常に存在しますか、または存在しますか?
2 に答える
すべてのオブジェクトには常にシングルトン クラスがあります。限目。ifs なし、 buts なし、例外なし。
コンパイラーまたはインタープリターがどれほど賢いかによって、パフォーマンスの最適化を実行する場合と実行しない場合があります。しかし、すべてのパフォーマンスの最適化と同様に、それらはプログラムの結果を変更することは許可されていないため、これらのパフォーマンスの最適化が特定のシングルトン クラスが実際には存在しない特定の状態につながる場合でも、プログラムはそれが存在するかのように動作する必要があります。だからあなたはとにかく言うことができないでしょう。結局のところ、それが「パフォーマンスの最適化」の定義とほぼ同じです。
最適化を行う Ruby 実装もあれば、別の最適化を行うものもあれば、まったく最適化を行わないものもあります。プログラムの結果からはわかりません。気にする必要はありません。気にする必要はありません。
たとえば、YARV は次の最適化を実行します。
シングルトン メソッドを持つオブジェクトはほとんどないため、すべてのオブジェクトに対してシングルトン クラスを作成するのはメモリの浪費になるため、シングルトン クラスは遅延して作成され
def foo.bar
ます。オブジェクトのシングルトン クラス ( ) を要求するとき。Object#define_singleton_method
class << foo
Object#singleton_class
ほとんどすべてのクラスには何らかのクラス メソッドがあるため、シングルトン クラスを遅延して作成するオーバーヘッドは意味がありません。そのため、クラスの場合、シングルトン クラスは常に熱心に作成されます。
しかし、これは YARV の非公開の内部実装の詳細です。JRuby は別の方法で行う場合があります。IronRuby は別の方法で行う場合があります。MacRuby は別の方法で行う場合があります。MRuby は別の方法で行う場合があります。トパーズは別の方法で行う場合があります。ルビニウスは違うやり方をするかもしれません。MagLev は別の方法で行う場合があります。YARV の次のパッチ レベルでさえ、別の方法で行う可能性があります。
シングルトンクラスを見ると、そこにあります。見なければ、あっても構わない。したがって、意味的には常にそこにあります。
クラスのようなオブジェクトの場合、新しいクラスが作成されるとその固有クラスも作成され、オブジェクトが作成されるとその固有クラスも作成されます。
例:- クラスの作成
class User; end
また
User = Class.new
その固有クラスも同時に作成され、
そして、 User クラスのすべてのオブジェクトに対して個別の固有クラスが作成されます