一篇文章带你搞清Ruby对象模型
Posted 柚长成记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章带你搞清Ruby对象模型相关的知识,希望对你有一定的参考价值。
本文阐述了看似错综复杂的关于Ruby对象模型中的:类、单例类、父类、Class类、实例方法、单例方法、类方法、对象、模块、实例变量、类实例变量、类变量、属性,之间的关系。
读书笔记来自于《Ruby元编程》第二章对象模型以及第五章类定义,画图、总结并从每个对象的视角出发说明关系。
从obj对象出发:
obj对象是B类的一个实例。
对象的实例方法来自两部分,一部分为来自该对象的单例类#obj中定义的单例方法obj_singleton_method,该单例方法只属于该对象,即使同类的其他对象都不可调用该方法。
在对象的单例类#obj中,还有定义的该对象的实例变量,该实例变量只属于该对象,即使同类的其他对象都不可调用该实例变量。
对象的另一部分实例方法来自于,该对象的类B其中定义的实例方法obj_instance_method,以及B类从所有父类包括A类,Object类,BasicObject类中继承来的实例方法,该实例方法属于该类的所有对象。
在对象的类B中,有类变量,类变量对于该类的所有对象是公有的,obj对象可以调用该类变量。
对象的单例类的父类是该对象的类。
从B类出发:
B类中有操作属于该类的所有对象的实例方法obj_instance_method,以及类变量。
B类的父类是A类,B的对象可以调用B类的所有父类,包括A类,Object类,BasicObject类中的所有实例方法。
当把B类作为对象看待时,产生B类的类,表面上是Class类,B.class 为 Class类。
但实际上B类的类为B类的单例类#B。
该单例类的父类之一为Class类。
把B类当作对象来操作的方法为类方法B_class_method,类方法在单例类#B中。
类方法就是类的单例方法B_singleton_method,该单例方法位于单例类#B中,单例方法或类方法只属于该类,Class类的其他对象不可调用该类方法。
B的单例类#B中还有类实例变量,就是把类作为对象的实例变量,该类实例变量只属于该类对象,Class类的其他对象不可调用该类实例变量。
把B类当作对象来操作的实例方法还有一部分在Class类中B_instance_method,该实例方法Class类的所有对象都可以调用。该方法有两个,一个是new,另一个是superclass。
一个类的单例类的父类是该类的父类的单例类
向上找父类S:
类的默认父类是Object类,Object类的父类是BasicObject类。BasicObject类的父类为nil。
Class类的父类是Module,类是加强了的模块。
Module的父类是Object。
向右找类C:
一切类包括Class类本身的类都是Class类。
有趣的是:
BasicObject的单例类#BasicObject的父类是Class
BasicObject的单例类#BasicObject的类也是Class
属性:
属性属于拟态方法,也就是说本质是方法,该方法更本质的是读写实例变量。属性在类中,同实例方法一样。类属性在单例类中,同类方法一样。
以上是关于一篇文章带你搞清Ruby对象模型的主要内容,如果未能解决你的问题,请参考以下文章