ruby 对象模型

Posted by wxianfeng Mon, 07 Jan 2013 21:54:00 GMT

环境: 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 中方法查找的话, 就必须要知道了, 下回分解.