来自Ruby世界似乎是这样说的,“Ruby内一切都是对象”。
有趣的一切都是对象,那么一切也就没有不再是对象了?
"面向对象的设计方法是在结构化编程对控制流程实现了结构化后,又加上了对数据的结构化。"——《松本行弘的程序世界》
这里引用自《Ruby Hacking Guide》的对象一章的说法,对象存在的必要条件
- 能够区分自身与其它(拥有标识)
- 能够响应请求(方法)
- 保持内部状态(实例变量)
Ruby 中的类层次结构
然后我们再看看一个有意思的结果:
- irb(main):022:0>Object.class
- =>Class
- irb(main):023:0>Object.superclass
- =>BasicObject
- irb(main):024:0>BasicObject.superclass
- =>nil
- irb(main):025:0>
这里使用的是1.9.3版本的ruby,于是这是Ruby的类层次结构,至于为什么是这样的,不凡看看下面的这些代码。
- void
- Init_class_hierarchy(void)
- {
- rb_cBasicObject=boot_defclass("BasicObject",0);
- rb_cObject=boot_defclass("Object",rb_cBasicObject);
- rb_cModule=boot_defclass("Module",rb_cObject);
- rb_cClass=boot_defclass("Class",rb_cModule);
- rb_const_set(rb_cObject,rb_intern("BasicObject"),rb_cBasicObject);
- RBASIC_SET_CLASS(rb_cClass,rb_cClass);
- RBASIC_SET_CLASS(rb_cModule,rb_cClass);
- RBASIC_SET_CLASS(rb_cObject,rb_cClass);
- RBASIC_SET_CLASS(rb_cBasicObject,rb_cClass);
- }
这是用于初化化类层次的代码,也就是hierarchy的意思,层次,层次结构。
至于,boot_defclass那么就看看下面的
- staticVALUE
- boot_defclass(constchar*name,VALUEsuper)
- {
- VALUEobj=rb_class_boot(super);
- IDid=rb_intern(name);
- rb_name_class(obj,id);
- rb_const_set((rb_cObject?rb_cObject:obj),id,obj);
- returnobj;
- }
如果这里还有什么令人不明白的地方,那么可能就是VALUE了。
原文是这么长:
- #ifdefinedHAVE_UINTPTR_T&&0
- typedefuintptr_tVALUE;
- typedefuintptr_tID;
- #defineSIGNED_VALUEintptr_t
- #defineSIZEOF_VALUESIZEOF_UINTPTR_T
- #undefPRI_VALUE_PREFIX
- #elifSIZEOF_LONG==SIZEOF_VOIDP
- typedefunsignedlongVALUE;
- typedefunsignedlongID;
- #defineSIGNED_VALUElong
- #defineSIZEOF_VALUESIZEOF_LONG
- #definePRI_VALUE_PREFIX"l"
- #elifSIZEOF_LONG_LONG==SIZEOF_VOIDP
- typedefunsignedLONG_LONGVALUE;
- typedefunsignedLONG_LONGID;
- #defineSIGNED_VALUELONG_LONG
- #defineLONG_LONG_VALUE1
- #defineSIZEOF_VALUESIZEOF_LONG_LONG
- #definePRI_VALUE_PREFIXPRI_LL_PREFIX
- #else
- #error---->>rubyrequiressizeof(void*)==sizeof(long)orsizeof(LONG_LONG)tobecompiled.<<----
- #endif
那么,简化一下为和前几个版本一致的,那么就是
- typedefunsignedlongVALUE;
原本的模型应该是这样的
Ruby的对象变的
让我们再简单看一看一个示例
- irb(main):025:0>1.class
- =>Fixnum
- irb(main):026:0>Fixnum.class
- =>Class
- irb(main):027:0>Fixnum.superclass
- =>Integer
- irb(main):028:0>Fixnum.superclass.superclass
- =>Numeric
- irb(main):029:0>Fixnum.superclass.superclass.superclass
- =>Object
- irb(main):030:0>Fixnum.superclass.superclass.superclass.superclass
- =>BasicObject
- irb(main):031:0>
好吧,我觉得引用RHG中的图来说明可能会更简单一点,只是这张图只能做一时只用 (转载保留Phodal's
BlogPhodal'szenthink)
因为这些都已经改变了
原先的对象只有这些
- #defineR_CAST(st)(structst*)
- #defineRBASIC(obj)(R_CAST(RBasic)(obj))
- #defineROBJECT(obj)(R_CAST(RObject)(obj))
- #defineRCLASS(obj)(R_CAST(RClass)(obj))
- #defineRMODULE(obj)RCLASS(obj)
- #defineRFLOAT(obj)(R_CAST(RFloat)(obj))
- #defineRSTRING(obj)(R_CAST(RString)(obj))
- #defineRREGEXP(obj)(R_CAST(RRegexp)(obj))
- #defineRARRAY(obj)(R_CAST(RArray)(obj))
- #defineRHASH(obj)(R_CAST(RHash)(obj))
- #defineRDATA(obj)(R_CAST(RData)(obj))
- #defineRSTRUCT(obj)(R_CAST(RStruct)(obj))
- #defineRBIGNUM(obj)(R_CAST(RBignum)(obj))
- #defineRFILE(obj)(R_CAST(RFile)(obj))
可是现在呢?
- #defineR_CAST(st)(structst*)
- #defineRBASIC(obj)(R_CAST(RBasic)(obj))
- #defineROBJECT(obj)(R_CAST(RObject)(obj))
- #defineRCLASS(obj)(R_CAST(RClass)(obj))
- #defineRMODULE(obj)RCLASS(obj)
- #defineRFLOAT(obj)(R_CAST(RFloat)(obj))
- #defineRSTRING(obj)(R_CAST(RString)(obj))
- #defineRREGEXP(obj)(R_CAST(RRegexp)(obj))
- #defineRARRAY(obj)(R_CAST(RArray)(obj))
- #defineRHASH(obj)(R_CAST(RHash)(obj))
- #defineRDATA(obj)(R_CAST(RData)(obj))
- #defineRTYPEDDATA(obj)(R_CAST(RTypedData)(obj))
- #defineRSTRUCT(obj)(R_CAST(RStruct)(obj))
- #defineRBIGNUM(obj)(R_CAST(RBignum)(obj))
- #defineRFILE(obj)(R_CAST(RFile)(obj))
- #defineRRATIONAL(obj)(R_CAST(RRational)(obj))
- #defineRCOMPLEX(obj)(R_CAST(RComplex)(obj))
比之前多了TYPEDATA,RATIONAL,COMPLEX三个对象
Ruby 不变的对象
让我们看看结构化的那部分
- structRBasic{
- VALUEflags;
- constVALUEklass;
- }
以及Object
- structRObject{
- structRBasicbasic;
- union{
- struct{
- longnumiv;
- VALUE*ivptr;
- structst_table*iv_index_tbl;/*shortcutforRCLASS_IV_INDEX_TBL(rb_obj_class(obj))*/
- }heap;
- VALUEary[ROBJECT_EMBED_LEN_MAX];
- }as;
- };
还有Rstring
- structRString{
- structRBasicbasic;
- union{
- struct{
- longlen;
- char*ptr;
- union{
- longcapa;
- VALUEshared;
- }aux;
- }heap;
- charary[RSTRING_EMBED_LEN_MAX+1];
- }as;
- };
于是让我们回到
对象存在的必要条件
- 能够区分自身与其它(拥有标识)
- 能够响应请求(方法)
- 保持内部状态(实例变量)
- structRBasic{
- VALUEflags;
- constVALUEklass;
- }
这两部分。
- flags是个多目的的标记,大多用以记录结构体的类型。
- klass包含了这个对象归属的类。
最后,让我们看看Float是怎么说的
- structRFloat{
- structRBasicbasic;
- doublefloat_value;
- };
|
请发表评论