Ruby的太极八卦图
关键词:Ruby,html,Guide
axgle:
<img src=http://rhg.rubyforge.org/images/ch_class_boot1.png />
<img src=http://rhg.rubyforge.org/images/ch_class_metaobj.png />
Ruby的太极八卦图:和谐、对称、平衡、循环、稳定等原理代表着中华民族对宇宙,对人生的深刻思考。
想不到日本人松本先生把我们中国古代哲学思想应用在了现代程序语言的设计中。
Ruby编程之道,就蕴含在上面的太极八卦图里。
下面是中国古代太极八卦图:
<img src=http://www.ugafukuya.com/taikyokuhake.jpg />
《为什麽韩国国旗用了太极八卦图?》
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.
axgle:
我有一个疑问,就是
<img src=http://rhg.rubyforge.org/images/ch_class_metaobj.png />
这里的OtherClass为什麽接在了上面的Object而不是下面的Class?
在ruby里面,
true
而
false
要么是我理解有误,要么就是这个图里OtherClass应当链接在下面的Class,要么我们都错了?<img src=http://www.javaeye.com/images/smiles/icon_cool.gif/>
bencode:
这是继承关系
axgle:
如果我把“OtherClass”链接在Class上面,但不是用继承关系,而是用“实例化”表示,也就是用黑箭头而非白箭头表示呢?
换句话,“OtherClass应当是Class的实例。”
虽然原图“OtherClass继承Object”可以相同推论出“OtherClass是Class的实例”,但为什麽不直接就让“OtherClass是Class的实例”呢?
bencode:
不是推不推的问题. 这张图反映了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
dreamhead:
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的实例”。
axgle:
thanks.
谁的美工好,能够画一个类似下面的八卦图,感谢先~~~
下面是我画的,很粗糙,但是大体模样就是这样的,希望能够看到比这个图准确并且漂亮的ruby八卦图<img src=http://www.javaeye.com/images/smiles/icon_wink.gif/>
<img alt="3832e3cd-ced2-4706-bf96-fb64cf1be21a-thumb" class="magplus" src=http://www.javaeye.com/upload/attachment/3995/3832e3cd-ced2-4706-bf96-fb64cf1be21a-thumb.png?1199174483 title="点击查看原始大小图片" />
描述:
大小: 10.5 KB
查看次数: 101
basicbest:
寒,真够八卦的:D
zhangyu8374:
在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);
那有没有其余的方式也可以描述类似的关系呢?那个日本人当初是怎样想到的,或怎样抉择的?
谁有这方面的资料吗<img src=http://www.javaeye.com/images/smiles/icon_wink.gif/>
fredzhang:
引用
我有一个疑问,就是这里的OtherClass为什麽接在了上面的Object而不是下面的Class?
Object
从代码中可以看出任何一个类Otherclass的superclass是Object而不是Class,这是因为任何类均必须是Object。
之所以Otherclass被看作是Class是因为Otherclass的超类Object的meta class(在图中用(Object)表示)继承自Class
fredzhang:
假如加上完整的对象关系,八卦图应该如下呈现。
<img alt="2fb4a83c-1a28-4aa0-aee0-4f77aafb8c2c-thumb" class="magplus" src=http://www.javaeye.com/upload/attachment/6480/2fb4a83c-1a28-4aa0-aee0-4f77aafb8c2c-thumb.png?1199174522 title="点击查看原始大小图片" />
描述:
大小: 31.8 KB
查看次数: 608
dennis_zane:
楼上的图才算是完整了,OtherClass类的实例是instance,instance的singleton类是(instance),继承自OtherClass,这个(instance)在ruby层次上无法见到。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);这一段代码实在是很精彩,放弃讨论先有鸡还是先有蛋,同时创造鸡和蛋,那么对象的生命循环开始。