锁定老帖子 主题:玩转Ruby系列:玩转ruby的继承关系
精华帖 (2) :: 良好帖 (1) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-02
最后修改:2009-07-08
学习ruby也有一段时间了,平时也只顾着开发,没好好弄清楚一些细节,今天发现还不清楚类的层次关系,所以再次复习,好好的搞清楚。 先来做个实验:
"samsam".class # => String "samsam".class.class # => Class "samsam".class.class.class # => Class "samsam".class.class.superclass # => Module "samsam".class.class.superclass.class # => Class "samsam".class.class.superclass.superclass # => Object "samsam".class.class.superclass.superclass.class # => Class "samsam".class.class.superclass.superclass.superclass # => nil
从上面的实验可以看出,所有类都是Class的对象,Class的父类是Module,Module的父类是Object,Object是顶层类,没有父类。 层次关系是Class << Module << object
比较新鲜的是类都是Class的对象,一般对象和类对象有什么不一样吗?在底层是不一样的结构,一般对象不保存方法,方法保存在类对象中。
struct RObject { struct RBasic basic; struct st_table *iv_tbl; }; struct RClass { struct RBasic basic; struct st_table *iv_tbl; struct st_table *m_tbl; VALUE super; };
只是我们在 Ruby 里面看起来它们是一样的,或者说,类的类型派生自对象的类型,加了一个放函数的表和一个指向父类的域。 一个特定的类就是"类(Class)"这个类的一个实例,这个就要接触到元编程了(meta-programming),这是另一个很大的主题,接下来准备研究研究元编程。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-02
最后修改:2009-07-02
引用 比较新鲜的是类都是Class的对象,一般对象和类对象有什么不一样吗?在底层是不一样的结构,一般对象不保存方法,方法保存在类对象中。
这个理解似乎不是很正确。C Ruby的实现看不大懂,不过JRuby RObject继承RBase,构造函数要求RClass。所以我认为struct RObject和struct RClass绝对不是并列的关系。我猜测c实现里面无论类对象还是实例对象都是RObject,通过RBase里面的klass来检索相关RClass方法表。 个人猜测号称纯oo的语言应该不会有所谓的“特殊类”,否则和C++ vtable就没有太多本质不同了。而且我觉得学习Ruby应该不需要太关心c一级实现,按照纯oo思想理解就好。当然如果有大牛愿意讲解这方面自然是很好的学习机会。 |
|
返回顶楼 | |
发表时间:2009-07-02
最后修改:2009-07-02
引用
所以我认为struct RObject和struct RClass绝对不是并列的关系。
|
|
返回顶楼 | |
发表时间:2009-07-02
我的意思是你把类对象作为特殊的一种对象提出来不妥当,类对象和一般对象没有什么区别
|
|
返回顶楼 | |
发表时间:2009-07-03
最后修改:2009-07-03
类Class的爸爸是Module,Module的爸爸是Object。而Object是所有类的祖宗。但是类Object还是类Class的实例。。。。
到底是鸡生蛋还是蛋生鸡谁也搞不清.. 所以最好的办法就是不要搞了 哈哈 引用 所有类都是Class的对象,Class的父类是Module,Module的父类是Object,Object是顶层类,没有父类
这句话貌似没有什么问题,但是不要忘了在ruby继承关系中还有模块,Object mix-in了Kernel模块,所以Kernel才是祖宗... irb(main):001:0> Object.ancestors => [Object, Kernel] 引用 个人猜测号称纯oo的语言应该不会有所谓的“特殊类”,否则和C++ vtable就没有太多本质不同了
要说特殊还是有的,比如ruby里面的顶层对象Object(main)举个小例子,看看main对象有什么特殊: def obj_main_method puts self end obj_main_method #=>main self.obj_main_method #=>private method `obj_main_method' called for main:Object (NoMethodError) #略有不同之处在于正常的Object方法默认是public的,而main对象的方法默认是private的(irb中没差别) 也是main的存在使得ruby的OO不是那么纯(形式上..),当然这使得ruby更人性化.. require'pp' puts 'something' def something #do.. end #而不是下面这样: Main.require'pp' Main.puts 'something' class Main def something #do something end end |
|
返回顶楼 | |
发表时间:2009-07-03
这幅图也不错..
|
|
返回顶楼 | |
发表时间:2009-07-03
main是比较特殊,有了main的存在,才不用像Java那样不管干吗都要有个Main类,ruby才能写出过程式的程序
|
|
返回顶楼 | |
发表时间:2009-07-03
Class 是比较有意思的 class:
class Class def class '类' end end 讨厌 new 的人如何生活: class Class def [] *xs self.new *xs end end evil ruby 可以给你更多 black magic spell。 虽然这个设计会导致罗素悖论,但是一般理发师都没这么坚持原则的所以就无所谓了。 |
|
返回顶楼 | |
发表时间:2009-07-04
嗯……话说Ruby 1.9的Object是继承自BasicObject的。《The Ruby Programming Language》也有提到相关信息。
|
|
返回顶楼 | |
发表时间:2009-07-05
有点乱...
|
|
返回顶楼 | |