オブジェクトのシングルトンクラスがすでに作成されているかどうかを確認する方法はありますか?
例:obj.singleton_class_defined?
オブジェクトのシングルトンクラスは常に定義されます。1.8.7ではsingleton_methods
、オブジェクトにすでにシングルトンメソッドが関連付けられているかどうかを確認するために使用できます。
>> foo = ''
=> ""
>> foo.singleton_methods
=> []
1.9.2(おそらく、以前の1.9sでも、覚えていません)には、と呼ばれるメソッドもありsingleton_class
ます。これにより、class << self; self ; end
私たち全員が慣れていることを実行できなくなります。
>> foo.singleton_class #=> #<Class:#<String:0x00000100ba5648>>
編集:
これに「object-model」のタグを付けたので、次のリンクもお勧めします。
http://www.hokstad.com/ruby-object-model.html
そこから引用するには:
メタクラスは、すべての実用的な目的のために実際のクラスです。Class型のオブジェクトです。メタクラスの「特別な」唯一のことは、必要に応じて作成され、オブジェクトの「実際の」クラスの前に継承チェーンに挿入されることです。したがって、MRIインタープリターオブジェクト内で-> klassは、チェーン内の次のクラスを参照する「super」という名前のポインターを持つメタクラスを参照できます。MRIでobject.classを呼び出すと、インタープリターは実際にメタクラス(およびモジュール)が存在する場合はそれを「スキップ」します。