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

Ruby的太极八卦图

浏览 17811 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-04  


Ruby的太极八卦图:和谐、对称、平衡、循环、稳定等原理代表着中华民族对宇宙,对人生的深刻思考。
想不到日本人松本先生把我们中国古代哲学思想应用在了现代程序语言的设计中。
Ruby编程之道,就蕴含在上面的太极八卦图里。

下面是中国古代太极八卦图:


《为什么韩国国旗用了太极八卦图?》
http://zhidao.baidu.com/question/10732132.html

来源:Ruby Hacking Guide
The “Ruby Hacking Guide” is a book that explains how the ruby interpreter (the official C implementation of the Ruby language) works internally.

   发表时间:2007-02-04  
我有一个疑问,就是

这里的OtherClass为什么接在了上面的Object而不是下面的Class?

在ruby里面,
OtherClass=Class.new
OtherClass.respond_to?("class_eval") #=>true



OtherClass=Object.new
OtherClass.respond_to?("class_eval") #=>false


要么是我理解有误,要么就是这个图里OtherClass应该链接在下面的Class,要么我们都错了?
0 请登录后投票
   发表时间:2007-02-04  
这是继承关系
0 请登录后投票
   发表时间:2007-02-04  
假如我把“OtherClass”链接在Class上面,但不是用继承关系,而是用“实例化”表示,也就是用黑箭头而非白箭头表示呢?
换句话,“OtherClass应该是Class的实例。”

虽然原图“OtherClass继承Object”可以同样推论出“OtherClass是Class的实例”,但为什么不直接就让“OtherClass是Class的实例”呢?

0 请登录后投票
   发表时间:2007-02-05  
不是推不推的问题. 这张图反映了Ruby的类(Class Module Object)结构实现

普通的 Ruby 类 都有一个 Sigleton Class(此 Singleton Class 又称之为MetaClass , 而  meta class 的 super class 必要 Class
这样这样.. 你说是先有鸡还是先有蛋?  不是谁先有的问题, 而是你创建一个鸡或蛋, 就解决了.

于是, Class Module 和 Object 就是....

首先:

rb_cObject = boot_defclass("Object", 0);
rb_cModule = boot_defclass("Module", rb_cObject);
rb_cClass =  boot_defclass("Class",  rb_cModule);

in object.c

这句话对应于楼主的第一个图(第一排左边)

metaclass = rb_make_metaclass(rb_cObject, rb_cClass);
metaclass = rb_make_metaclass(rb_cModule, metaclass);
metaclass = rb_make_metaclass(rb_cClass, metaclass);

in object.c

再这三句之后, 就是楼主第一排第二个图了.

好了, 现在鸡(或蛋) 已有了,

以后用常规方式构造的其他对象  就形成了楼主帖的第三个图.


可以参考: http://rhg.rubyforge.org/chapter04.html







0 请登录后投票
   发表时间:2007-02-05  
To axgle:
首先,必须明确一下,希望看这个图时,大家要清楚类和对象的关系,这个图里画的都是对象。只不过,这些对象是“Class”这个类的实例。

区分一下这个图里的标识,蓝色的是真正的类,而灰色的是meta class(也叫singleton class)。也就是说(OtherClass)是OtherClass的meta class。

另外,白色的箭头表示的是继承关系,这也就是说明了,OtherClass是Object的子类,如果你看C实现的话,这个字段是用RClass的super这个字段来表示的。黑色的箭头表示的是这个对象的类,也就是说,OtherClass这个类对象的类是(OtherClass),在C实现中对应RBasic的klass字段。

axgle最开始的这几个图对应着Ruby的类层次最初搭建的过程,也就是对应着bencode所列举的代码。

axgle,你的理解不错,OtherClass确实应该和Class有关系。事实上,确实是这样,这个图中有一个关系没有表示出来,就是meta class的类。去看一下Ruby的实现代码,创建Class的实例的时候,其klass字段设置为Class。

至于你说的,为什么不直接用OtherClass指向Class,我前面强调过,这里表示的是对象之间的关系,(OtherClass)就是Class这个类实例,所以,OtherClass指向了(OtherClass),就表明了它们之间的关系,也就是说“OtherClass是Class的实例”。
0 请登录后投票
   发表时间:2007-02-05  
thanks.
谁的美工好,能够画一个类似下面的八卦图,谢谢先~~~
下面是我画的,很粗糙,但是大体模样就是这样的,希望能够看到比这个图准确并且漂亮的ruby八卦图
  • 大小: 10.5 KB
0 请登录后投票
   发表时间:2007-02-07  
寒,真够八卦的

:D
0 请登录后投票
   发表时间:2007-03-31  
在Object.c的Init_Object方法就可以清楚的看到lz所描述的关系。
void
Init_Object()
{
    VALUE metaclass;

    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);

    rb_mKernel = rb_define_module("Kernel");
    rb_include_module(rb_cObject, rb_mKernel);


那有没有其余的方式也可以描述类似的关系呢?那个日本人当初是怎么想到的,或者如何抉择的?

谁有这方面的资料吗
0 请登录后投票
   发表时间:2007-06-12  
引用

我有一个疑问,就是这里的OtherClass为什么接在了上面的Object而不是下面的Class?


Class Otherclass
  def test
    puts "test"
  end
end
Otherclass.superclass  => Object

从代码中可以看出任何一个类Otherclass的superclass是Object而不是Class,这是因为任何类均必须是Object。
之所以Otherclass被看作是Class是因为Otherclass的超类Object的meta class(在图中用(Object)表示)继承自Class
0 请登录后投票
论坛首页 编程语言技术版

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