メタプログラミング 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 件のコメント:
コメントを投稿