Ruby的类和对象模型
Upcoming SlideShare
Loading in...5
×
 

Ruby的类和对象模型

on

  • 1,980 views

 

Statistics

Views

Total Views
1,980
Views on SlideShare
1,955
Embed Views
25

Actions

Likes
1
Downloads
17
Comments
0

1 Embed 25

http://www.slideshare.net 25

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Ruby的类和对象模型 Ruby的类和对象模型 Presentation Transcript

  • 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