环境: mac 10.8 + ruby 1.9.2
ruby 对象模型非常重要, 不了解ruby对象模型, 不算真正掌握ruby, ruby 号称一切都是对象, why? 当你知道对象模型就清楚了.
说到ruby对象模型, 这张图是ruby基本的类关系.
class 表示实例关系(水平),super 表示继承关系(垂直),从图中可以看出
objmy 是 MyClass 的实例
MyClass 是 Class 的实例
Class 的父类是 Module
MyClass 的父类是 Object
Object 的父类是 BasicObject (ruby1.9)
MyClass include 模块M后,相当于在继承祖先链正上方继承该模块
Object include 模块Kernel
Module类的superclass 是Object
所有都可以在irb看到:
ruby-1.9.2-p290 :001 > MyClass = Class.new => MyClass ruby-1.9.2-p290 :002 > objmy = MyClass.new => #<MyClass:0x007f9ea1aba080> ruby-1.9.2-p290 :003 > objmy.class => MyClass ruby-1.9.2-p290 :004 > MyClass.class => Class ruby-1.9.2-p290 :005 > MyClass.superclass => Object ruby-1.9.2-p290 :006 > Class.class => Class ruby-1.9.2-p290 :007 > Class.superclass => Module ruby-1.9.2-p290 :008 > Module.class => Class ruby-1.9.2-p290 :009 > Module.superclass => Object ruby-1.9.2-p290 :010 > Object.class => Class ruby-1.9.2-p290 :011 > Object.superclass => BasicObject ruby-1.9.2-p290 :012 > BasicObject.class => Class ruby-1.9.2-p290 :013 > BasicObject.superclass => nil
所以掌握了 Object,Module,Class 三者之间关系很重要, ruby 很多gem里的方法都是打开 Object来注入方法的.这样下面任何对象就都有该实例方法了.
demo:
#!/usr/bin/env ruby class Object def foo p "im foo" end end MyClass = Class.new objmy = MyClass.new objmy.foo # im foo
有一个gem可以查看ruby对象模型, drx
安装:
>gem install drx >brew install graphviz
使用:
wxianfeng-2:entos wangxianfeng$ irb ruby-1.9.2-p290 :001 > require 'drx' => true ruby-1.9.2-p290 :002 > MyClass = Class.new => MyClass ruby-1.9.2-p290 :003 > objmy = MyClass.new => #<MyClass:0x007fcd1221b2e0> ruby-1.9.2-p290 :004 > objmy.see
出现下图:
这样就更加一目了然了.但是注意上图引入了eigenclass概念, 想了解 ruby 中方法查找的话, 就必须要知道了, 下回分解.