2013-02-05

Ruby の勉強記録 (classのクラス)

メタプログラミング Ruby が楽しい。 まだ理解しきっていない気がするので、忘れてもいいように実験の結果を残しておく。



インスタンスのクラス名のパス

ClassのクラスはClassなのかぁ。

1.9.3-p194 :002 >
1.9.3-p194 :003 > a = "hoge"
 => "Hello, world"
1.9.3-p194 :004 > a.class
 => String
1.9.3-p194 :005 > a.class.class
 => Class
1.9.3-p194 :006 > a.class.class.class
 => Class
1.9.3-p194 :007 > a.class.class.class.class
 => Class



classのスーパクラスは何クラス?



継承はこうなる

String -> Object -> Class -> BasicObject -> nil

  • 実験
1.9.3-p194 :009 > a.class
 => String
1.9.3-p194 :010 > a.class.superclass
 => Object
1.9.3-p194 :011 > a.class.superclass.class
 => Class
1.9.3-p194 :012 > a.class.superclass.superclass
 => BasicObject
1.9.3-p194 :013 > a.class.superclass.superclass.class
 => Class
1.9.3-p194 :014 > a.class.superclass.superclass.superclass
 => nil



nil はどういう扱いになるのかな

1.9.3-p194 :014 > a.class.superclass.superclass.superclass
 => nil
1.9.3-p194 :015 > a.class.superclass.superclass.superclass.class
 => NilClass
1.9.3-p194 :016 > a.class.superclass.superclass.superclass.class.superclass
 => Object
1.9.3-p194 :017 > a.class.superclass.superclass.superclass.class.superclass.class
 => Class
1.9.3-p194 :018 > a.class.superclass.superclass.superclass.class.superclass.class.superclass
 => Module
1.9.3-p194 :019 > a.class.superclass.superclass.superclass.class.superclass.class.superclass.class
 => Class
1.9.3-p194 :020 > a.class.superclass.superclass.superclass.class.superclass.class.superclass.class.superclass
 => Module
1.9.3-p194 :021 > a.class.superclass.superclass.superclass.class.superclass.class.superclass.class.superclass.class
 => Class
1.9.3-p194 :022 > a.class.superclass.superclass.superclass.class.superclass.class.superclass.class.superclass.class.superclass
 => Module
1



わかったこと



クラスとインスタンスの関係


-----------------------------
インスタンス <= クラス
-----------------------------
"hoge"       <= String
String       <= Class
nil          <= NilClass
NilClass     <= Class
Module       <= Class
Class        <= Class
-----------------------------



クラスの継承の関係

String -> Object -> Class -> BasicObject -> nil


Class -> Module -> Object -> BasicObject -> nil

モジュール挟まないのもあるのか。 Class クラスが特別な存在であることがわかった。



インスタンスのメソッドについて


"hoge".supreclass
nil.supreclass


ともに同じNoMethodErrorが発生。
"hoge", nil レシーバのメソッドは .supreclass をもっていない。
つまり、NilClass, Stringクラスは superclassが定義されていない。
ここはどうなってるのか、今度調べてみよう。



1.9.3p362 :017 > String.superclass.superclass.superclass.superclass
NoMethodError: undefined method `superclass' for nil:NilClass
        from (irb):17
        from /home/ya-ota/.rvm/rubies/ruby-1.9.3-p362/bin/irb:16:in `
' 1.9.3p362 :018 > "hoge".superclass NoMethodError: undefined method `superclass' for "hoge":String from (irb):18 from /home/ya-ota/.rvm/rubies/ruby-1.9.3-p362/bin/irb:16:in `
' 1.9.3p362 :019 >



なにか変な勘違いしていたら、ご指摘いただけると幸いです。

0 件のコメント:

コメントを投稿