2011-01-04 9 views
0

私が知りたいのは、すでに作成された オブジェクトのシングルトンクラスをチェックする方法はありますか?オブジェクトのシングルトンクラスはすでに作成されていますか?

例:obj.singleton_class_defined?

+0

@egarcia優れた点。私は人々を助けることが大好きですが、誰かが助けを求めて、人々が助けてくれるような苦労を無視すると、ちょっと迷惑です。それは失礼です。 –

答えて

3

オブジェクトのシングルトンクラスは常に定義されます。

>> foo = '' 
=> "" 
>> foo.singleton_methods 
=> [] 

1.9.2れ、またsingleton_classと呼ばれる方法があります(おそらくも早い1.9s、私は覚えていないことができます):1.8.7では、オブジェクトがすでにシングルトンメソッドを関連付けられているかどうかを確認するためにsingleton_methodsを使用することができます私もfollowiをお勧めしたい、あなたは「オブジェクト・モデル」でこれをタグ付けするので

>> foo.singleton_class #=> #<Class:#<String:0x00000100ba5648>> 

編集:あなたは、我々はすべてに慣れclass << self; self ; endことをやってから保存しますNGリンク:

http://www.hokstad.com/ruby-object-model.html

そこから引用すると:

メタクラスは、すべての実用的な 目的実際のクラスです。クラスタイプの オブジェクトです。唯一のもの メタクラスについての「特別」は、 を継承チェーンの オブジェクト「本当の」クラスの前に挿入することです。だから MRIインタープリタオブジェクト - >クラス は を指す "super"というポインタを持つ ポインタを持つメタクラスを参照することができます。 MRIのobject.classを呼び出すと、 の場合、 メタタイプ(およびモジュール)の インタプリタは実際には メタクラス(およびモジュール)を「スキップ」します。

+0

確かに、シングルトンクラスは常にクラス型のオブジェクトを返し、継承チェーンのオブジェクト "実"クラスの前に挿入します。しかし、私は、オブジェクトがシングルトンクラスを使用している場合、それは図に表示されますが、オブジェクトがシングルトンクラスをまだ使用していない場合、オブジェクトの祖先の図を生成したいと思います。 – Samnang

+0

次に、 'obj.singleton_methods.empty? 'を確認してください:) –

+0

この回答は間違っています。シングルトンクラスは、クラスの場合を除いて常に定義されているわけではありません。 T_OBJECTsの場合、シングルトンクラスが必要なときにシングルトンクラスが遅延生成されます。 – horseyguy