论坛首页 编程语言技术论坛

玩转Ruby系列:玩转ruby的继承关系

浏览 8333 次
精华帖 (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),这是另一个很大的主题,接下来准备研究研究元编程。

   发表时间: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思想理解就好。当然如果有大牛愿意讲解这方面自然是很好的学习机会。
0 请登录后投票
   发表时间:2009-07-02   最后修改:2009-07-02
引用
所以我认为struct RObject和struct RClass绝对不是并列的关系。




的确不是并列的关系,RClass是派生自RObject的


 

0 请登录后投票
   发表时间:2009-07-02  
我的意思是你把类对象作为特殊的一种对象提出来不妥当,类对象和一般对象没有什么区别
0 请登录后投票
   发表时间: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



  • 大小: 40.9 KB
0 请登录后投票
   发表时间:2009-07-03  
这幅图也不错..


  • 大小: 17.1 KB
0 请登录后投票
   发表时间:2009-07-03  
main是比较特殊,有了main的存在,才不用像Java那样不管干吗都要有个Main类,ruby才能写出过程式的程序
0 请登录后投票
   发表时间: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。

虽然这个设计会导致罗素悖论,但是一般理发师都没这么坚持原则的所以就无所谓了。
0 请登录后投票
   发表时间:2009-07-04  
嗯……话说Ruby 1.9的Object是继承自BasicObject的。《The Ruby Programming Language》也有提到相关信息。
0 请登录后投票
   发表时间:2009-07-05  
有点乱...
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics