ruby的类和对象模型

24
Ruby 的类和对象模型 David Ruan

Upload: yinhm-

Post on 20-Aug-2015

1.552 views

Category:

Technology


5 download

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

类的 CRUDC

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