一篇文章带你搞清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对象模型的主要内容,如果未能解决你的问题,请参考以下文章

一篇文章带你快速理解盒子模型经典案例

一篇文章带你快速理解盒子模型经典案例

如何在 ActiveRecords 中创建对 Ruby 中对象的引用?

一篇文章带你看懂 JVM基本结构内存模型

掌握可视化卷积神经网络模型,带你畅游图像识别技术领域

一篇文章带你搞清楚一致性哈希算法