SlideShare a Scribd company logo
Ruby 的类和对象模型

   David Ruan
Reference

Ruby Hacking Guide (ruby 1.7.3
2002-09-12)
http://code.google.com/p/rhgchs/

Metaprogramming Ruby(ruby 1.9)
本页是最有用的信息,读过这两个资料和打算去读的就不
用往下看了。
为什么还要了解 C 语言的实现




因为 C 语言里没有 Magic
Ruby 中关于对象的理论

1 Ruby 中一切都是对象
2 类也是对象
3 对象有自己的类
对象的定义及其 C 语言的结构

1 能够区分自身与其它(拥有标
识)
2 能够响应请求(方法)
3 保持内部状态(实例变量)
1 能够区分自身与其它(拥有标识)


• 在 ruby 中,对象的内容表示为 C 的结构体,
  通常是以指针对其操作。每个类用一个不同
  的结构体表示, 但指针的类型都是 VALUE
能够响应请求(方法)和保持内部状态(实例变量)


响应请求必须通过类 (klass), 保持内部状态通过 (st_table*)
struct RBasic {
 unsigned long flags;
 VALUE klass;
 };
类的定义及其 C 语言的结构
1 类也是对象
2 类有实例方法和超类 (superclass)
3 类是模块的子类
RClass


struct RClass {
 struct RBasic basic;
 struct st_table *iv_tbl;
 struct st_table *m_tbl;
 VALUE super;
};
C 数据结构中的 super 和 klass




与 Class#superlcass() 和 Object#class() 不同
类的类 (Eigenclass)




类也是对象,所以类也要属于某个类来存放自己
    的方法,这就是引出 EigenClass
对象的 Eigen Class/Singleton Class
类的 Eigen Class/Singleton Class
类的引导


rb_cObject = boot_defclass("Object", 0);
rb_cModule = boot_defclass("Module", rb_cObject);
rb_cClass = boot_defclass("Class", rb_cModule);
metaclass = rb_make_metaclass(rb_cObject, rb_cClass);
metaclass = rb_make_metaclass(rb_cModule, metaclass);
metaclass = rb_make_metaclass(rb_cClass, metaclass);


(object.c)
引导图示
最终的类图




irb> A.eigenclass.superclass.superclass # 适用 1.7/1.8 , 1.9 还要多一个 superclass
=> Class
Object#eigenclass 的实现

Monkey Patch:

class Object
 def eigenclass
   class << self; self; end
 end
end
Dynamic Ruby



后面借用 CRUD 的方法来分析如何在 runtime 中
操作 ruby 各元素,只是为了方便从这种角度来
表明 ruby 拥有的某些动态性质,不一定是最佳
    方法,也没有列完整,仅作示例。
对象的 CRUD




   略去,但强调一下元类的作用
Singleton Class/Meta Class/Eigen Class
类的 CRUD
C
    class keyword
    Class.new
R
    Object.const_defined?
U
    Openclass
    Module
    instance_eval, class_eval
    method_missing
D
    Object.send(:remove_const,:MyClass) 不影响子类,因为只是删除 const
方法的 CRUD

C
    def keyword
    define_method
R
    method_defined?
U
    Alias
    bind/unbind
D
    undef_method
实例变量的 CRUD

C
    @variable_name
    attr_reader, attr_writer, attr_accessor
R
    instance_variable_defined?
    instance_variable_read
U
    instance_variable_set
D
    N/A
Not Only OOP
END

More Related Content

PDF
Coding Freestyle
Hao Lee
 
PPTX
Node.js 异步任务的四种模式
Stackia Jia
 
PDF
[圣思园][Java SE]Java se lesson 15
ArBing Xie
 
PPT
JS2
Jiang Wu
 
PDF
Jni攻略之十一――启动虚拟机调用Java类
yiditushe
 
PPTX
7 приемов архитектурного освещения
magsolar
 
PPT
Learning notes ruby
Roger Xia
 
PDF
第二章
贺 利华
 
Coding Freestyle
Hao Lee
 
Node.js 异步任务的四种模式
Stackia Jia
 
[圣思园][Java SE]Java se lesson 15
ArBing Xie
 
Jni攻略之十一――启动虚拟机调用Java类
yiditushe
 
7 приемов архитектурного освещения
magsolar
 
Learning notes ruby
Roger Xia
 
第二章
贺 利华
 

Similar to Ruby的类和对象模型 (7)

PPTX
Python面向对象开发基础篇
modou li
 
PDF
Rubyonrails(Chinese)
heisda
 
PDF
從 Classes 到 Objects: 那些 OOP 教我的事
Wen-Tien Chang
 
PDF
J Ruby和Rails 让Ruby语言融入Java项目
George Ang
 
PDF
介绍&第一章
贺 利华
 
PDF
001 Ruby小觀念與小技巧
Bruce Li
 
PDF
May the source_be_with_you
Eddie Kao
 
Python面向对象开发基础篇
modou li
 
Rubyonrails(Chinese)
heisda
 
從 Classes 到 Objects: 那些 OOP 教我的事
Wen-Tien Chang
 
J Ruby和Rails 让Ruby语言融入Java项目
George Ang
 
介绍&第一章
贺 利华
 
001 Ruby小觀念與小技巧
Bruce Li
 
May the source_be_with_you
Eddie Kao
 
Ad

More from yinhm . (6)

PDF
Dart intro
yinhm .
 
PDF
Emacs入门
yinhm .
 
PDF
Write a Google Closure Editor Plugin
yinhm .
 
ODP
git svn workflow
yinhm .
 
PDF
Raemon
yinhm .
 
PDF
Heroku
yinhm .
 
Dart intro
yinhm .
 
Emacs入门
yinhm .
 
Write a Google Closure Editor Plugin
yinhm .
 
git svn workflow
yinhm .
 
Raemon
yinhm .
 
Heroku
yinhm .
 
Ad

Ruby的类和对象模型