SlideShare uma empresa Scribd logo
1 de 24
Baixar para ler offline
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

Mais conteúdo relacionado

Semelhante a Ruby的类和对象模型

Learning notes ruby
Learning notes rubyLearning notes ruby
Learning notes rubyRoger Xia
 
J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目George Ang
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点Bin Shao
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
Java面试32题
Java面试32题Java面试32题
Java面试32题yiditushe
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
Java面试知识
Java面试知识Java面试知识
Java面试知识yiditushe
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programmingted-xu
 
3 hibernate映射元素和类型
3 hibernate映射元素和类型3 hibernate映射元素和类型
3 hibernate映射元素和类型Zelin Wang
 
介绍&第一章
介绍&第一章介绍&第一章
介绍&第一章贺 利华
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI建興 王
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识yiditushe
 
大公司的Java面试题集
大公司的Java面试题集大公司的Java面试题集
大公司的Java面试题集yiditushe
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典yiditushe
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记yiditushe
 

Semelhante a Ruby的类和对象模型 (20)

Learning notes ruby
Learning notes rubyLearning notes ruby
Learning notes ruby
 
J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目
 
Javascript 闭包
Javascript 闭包Javascript 闭包
Javascript 闭包
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
Java面试32题
Java面试32题Java面试32题
Java面试32题
 
hibernate
hibernatehibernate
hibernate
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
 
3 hibernate映射元素和类型
3 hibernate映射元素和类型3 hibernate映射元素和类型
3 hibernate映射元素和类型
 
介绍&第一章
介绍&第一章介绍&第一章
介绍&第一章
 
第二章
第二章第二章
第二章
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识
 
Js培训
Js培训Js培训
Js培训
 
大公司的Java面试题集
大公司的Java面试题集大公司的Java面试题集
大公司的Java面试题集
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
Clojure的魅力
Clojure的魅力Clojure的魅力
Clojure的魅力
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 

Mais de yinhm .

Dart intro
Dart introDart intro
Dart introyinhm .
 
Emacs入门
Emacs入门Emacs入门
Emacs入门yinhm .
 
Write a Google Closure Editor Plugin
Write a Google Closure Editor PluginWrite a Google Closure Editor Plugin
Write a Google Closure Editor Pluginyinhm .
 
git svn workflow
git svn workflowgit svn workflow
git svn workflowyinhm .
 

Mais de yinhm . (6)

Dart intro
Dart introDart intro
Dart intro
 
Emacs入门
Emacs入门Emacs入门
Emacs入门
 
Write a Google Closure Editor Plugin
Write a Google Closure Editor PluginWrite a Google Closure Editor Plugin
Write a Google Closure Editor Plugin
 
git svn workflow
git svn workflowgit svn workflow
git svn workflow
 
Raemon
RaemonRaemon
Raemon
 
Heroku
HerokuHeroku
Heroku
 

Ruby的类和对象模型