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_defclas...
引导图示
最终的类图




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_...
方法的 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...
Not Only OOP
END
Upcoming SlideShare
Loading in...5
×

Ruby的类和对象模型

1,549

Published on

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,549
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
19
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Ruby的类和对象模型

  1. 1. Ruby 的类和对象模型 David Ruan
  2. 2. Reference Ruby Hacking Guide (ruby 1.7.3 2002-09-12) http://code.google.com/p/rhgchs/ Metaprogramming Ruby(ruby 1.9) 本页是最有用的信息,读过这两个资料和打算去读的就不 用往下看了。
  3. 3. 为什么还要了解 C 语言的实现 因为 C 语言里没有 Magic
  4. 4. Ruby 中关于对象的理论 1 Ruby 中一切都是对象 2 类也是对象 3 对象有自己的类
  5. 5. 对象的定义及其 C 语言的结构 1 能够区分自身与其它(拥有标 识) 2 能够响应请求(方法) 3 保持内部状态(实例变量)
  6. 6. 1 能够区分自身与其它(拥有标识) • 在 ruby 中,对象的内容表示为 C 的结构体, 通常是以指针对其操作。每个类用一个不同 的结构体表示, 但指针的类型都是 VALUE
  7. 7. 能够响应请求(方法)和保持内部状态(实例变量) 响应请求必须通过类 (klass), 保持内部状态通过 (st_table*) struct RBasic { unsigned long flags; VALUE klass; };
  8. 8. 类的定义及其 C 语言的结构 1 类也是对象 2 类有实例方法和超类 (superclass) 3 类是模块的子类
  9. 9. RClass struct RClass { struct RBasic basic; struct st_table *iv_tbl; struct st_table *m_tbl; VALUE super; };
  10. 10. C 数据结构中的 super 和 klass 与 Class#superlcass() 和 Object#class() 不同
  11. 11. 类的类 (Eigenclass) 类也是对象,所以类也要属于某个类来存放自己 的方法,这就是引出 EigenClass
  12. 12. 对象的 Eigen Class/Singleton Class
  13. 13. 类的 Eigen Class/Singleton Class
  14. 14. 类的引导 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)
  15. 15. 引导图示
  16. 16. 最终的类图 irb> A.eigenclass.superclass.superclass # 适用 1.7/1.8 , 1.9 还要多一个 superclass => Class
  17. 17. Object#eigenclass 的实现 Monkey Patch: class Object def eigenclass class << self; self; end end end
  18. 18. Dynamic Ruby 后面借用 CRUD 的方法来分析如何在 runtime 中 操作 ruby 各元素,只是为了方便从这种角度来 表明 ruby 拥有的某些动态性质,不一定是最佳 方法,也没有列完整,仅作示例。
  19. 19. 对象的 CRUD 略去,但强调一下元类的作用 Singleton Class/Meta Class/Eigen Class
  20. 20. 类的 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
  21. 21. 方法的 CRUD C def keyword define_method R method_defined? U Alias bind/unbind D undef_method
  22. 22. 实例变量的 CRUD C @variable_name attr_reader, attr_writer, attr_accessor R instance_variable_defined? instance_variable_read U instance_variable_set D N/A
  23. 23. Not Only OOP
  24. 24. END
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×