Rubyの特異クラスについて勉強中です。
Rubyの特異クラスは、特異クラスを定義したインスタンスを生成したクラスの下に、さらにもう一つ無名クラスを継承されてインスタンス化しているのだと理解しています。
もちろん、特異クラスから生成されたインスタンスに対して、instance.classやinstance.ancestorsによって、無名クラスの存在を知ることはできず、それはユーザーが無名クラスの存在を感じなくて済むようなRubyの仕様の工夫である、と理解しています。
では、実際にそのインスタンスが特異クラスから生成されたものであるかを知るにはどのような方法があるのでしょうか?以下2通りの方法を試してみたのですが、うまくいきませんでした。
-
特異クラスを定義していない2つのインスタンスのクラスと定義したインスタンスのクラスのobject_idを比較を比較し、特異クラスを定義したインスタンスだけが違うobject_idを持っているから、特異クラスであることがわかる。
-
特異クラスを定義したインスタンスに対して
instance.class.singleton_class?
でtrueを返す。
ruby
1class Icecream 2 def flavor 3 p "chocolate" 4 end 5end 6 7ic = Icecream.new 8ic2 = Icecream.new 9ic3 = Icecream.new 10def ic.melt 11 return false 12end 13 14p ic.class.object_id 15p ic2.class.object_id 16p ic3.class.object_id 17 18p ic.class.singleton_class?
しかし、実際に得られたのはのような結果でした。
object_idはすべて同じで、 singleton_class?
はfalseを返してしまします。
70368599643720 70368599643720 70368599643720 false
自分はRubyのオブジェクト指向を全く勘違いしているのでしょうか?それとも特異クラスであると見分ける方法が他にあるのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/13 13:40
2019/09/13 14:14
2019/09/14 02:02 編集