`
yanfaguanli
  • 浏览: 658219 次
文章分类
社区版块
存档分类
最新评论

ruby三日游之后(一)——Ruby对象的一次探索

 
阅读更多


目录(?)[+]

来自Ruby世界似乎是这样说的,“Ruby内一切都是对象”。

有趣的一切都是对象,那么一切也就没有不再是对象了?

"面向对象的设计方法是在结构化编程对控制流程实现了结构化后,又加上了对数据的结构化。"——《松本行弘的程序世界》

这里引用自《Ruby Hacking Guide》的对象一章的说法,对象存在的必要条件

  1. 能够区分自身与其它(拥有标识)
  2. 能够响应请求(方法)
  3. 保持内部状态(实例变量)

Ruby 中的类层次结构


然后我们再看看一个有意思的结果:
  1. irb(main):022:0>Object.class
  2. =>Class
  3. irb(main):023:0>Object.superclass
  4. =>BasicObject
  5. irb(main):024:0>BasicObject.superclass
  6. =>nil
  7. irb(main):025:0>

这里使用的是1.9.3版本的ruby,于是这是Ruby的类层次结构,至于为什么是这样的,不凡看看下面的这些代码。
  1. void
  2. Init_class_hierarchy(void)
  3. {
  4. rb_cBasicObject=boot_defclass("BasicObject",0);
  5. rb_cObject=boot_defclass("Object",rb_cBasicObject);
  6. rb_cModule=boot_defclass("Module",rb_cObject);
  7. rb_cClass=boot_defclass("Class",rb_cModule);
  8. rb_const_set(rb_cObject,rb_intern("BasicObject"),rb_cBasicObject);
  9. RBASIC_SET_CLASS(rb_cClass,rb_cClass);
  10. RBASIC_SET_CLASS(rb_cModule,rb_cClass);
  11. RBASIC_SET_CLASS(rb_cObject,rb_cClass);
  12. RBASIC_SET_CLASS(rb_cBasicObject,rb_cClass);
  13. }

这是用于初化化类层次的代码,也就是hierarchy的意思,层次,层次结构。
至于,boot_defclass那么就看看下面的
  1. staticVALUE
  2. boot_defclass(constchar*name,VALUEsuper)
  3. {
  4. VALUEobj=rb_class_boot(super);
  5. IDid=rb_intern(name);
  6. rb_name_class(obj,id);
  7. rb_const_set((rb_cObject?rb_cObject:obj),id,obj);
  8. returnobj;
  9. }

如果这里还有什么令人不明白的地方,那么可能就是VALUE了。
原文是这么长:
  1. #ifdefinedHAVE_UINTPTR_T&&0
  2. typedefuintptr_tVALUE;
  3. typedefuintptr_tID;
  4. #defineSIGNED_VALUEintptr_t
  5. #defineSIZEOF_VALUESIZEOF_UINTPTR_T
  6. #undefPRI_VALUE_PREFIX
  7. #elifSIZEOF_LONG==SIZEOF_VOIDP
  8. typedefunsignedlongVALUE;
  9. typedefunsignedlongID;
  10. #defineSIGNED_VALUElong
  11. #defineSIZEOF_VALUESIZEOF_LONG
  12. #definePRI_VALUE_PREFIX"l"
  13. #elifSIZEOF_LONG_LONG==SIZEOF_VOIDP
  14. typedefunsignedLONG_LONGVALUE;
  15. typedefunsignedLONG_LONGID;
  16. #defineSIGNED_VALUELONG_LONG
  17. #defineLONG_LONG_VALUE1
  18. #defineSIZEOF_VALUESIZEOF_LONG_LONG
  19. #definePRI_VALUE_PREFIXPRI_LL_PREFIX
  20. #else
  21. #error---->>rubyrequiressizeof(void*)==sizeof(long)orsizeof(LONG_LONG)tobecompiled.<<----
  22. #endif


那么,简化一下为和前几个版本一致的,那么就是
  1. typedefunsignedlongVALUE;
原本的模型应该是这样的

Ruby的对象变的

让我们再简单看一看一个示例
  1. irb(main):025:0>1.class
  2. =>Fixnum
  3. irb(main):026:0>Fixnum.class
  4. =>Class
  5. irb(main):027:0>Fixnum.superclass
  6. =>Integer
  7. irb(main):028:0>Fixnum.superclass.superclass
  8. =>Numeric
  9. irb(main):029:0>Fixnum.superclass.superclass.superclass
  10. =>Object
  11. irb(main):030:0>Fixnum.superclass.superclass.superclass.superclass
  12. =>BasicObject
  13. irb(main):031:0>
好吧,我觉得引用RHG中的图来说明可能会更简单一点,只是这张图只能做一时只用(转载保留Phodal's BlogPhodal'szenthink)

因为这些都已经改变了
原先的对象只有这些
  1. #defineR_CAST(st)(structst*)
  2. #defineRBASIC(obj)(R_CAST(RBasic)(obj))
  3. #defineROBJECT(obj)(R_CAST(RObject)(obj))
  4. #defineRCLASS(obj)(R_CAST(RClass)(obj))
  5. #defineRMODULE(obj)RCLASS(obj)
  6. #defineRFLOAT(obj)(R_CAST(RFloat)(obj))
  7. #defineRSTRING(obj)(R_CAST(RString)(obj))
  8. #defineRREGEXP(obj)(R_CAST(RRegexp)(obj))
  9. #defineRARRAY(obj)(R_CAST(RArray)(obj))
  10. #defineRHASH(obj)(R_CAST(RHash)(obj))
  11. #defineRDATA(obj)(R_CAST(RData)(obj))
  12. #defineRSTRUCT(obj)(R_CAST(RStruct)(obj))
  13. #defineRBIGNUM(obj)(R_CAST(RBignum)(obj))
  14. #defineRFILE(obj)(R_CAST(RFile)(obj))
可是现在呢?
  1. #defineR_CAST(st)(structst*)
  2. #defineRBASIC(obj)(R_CAST(RBasic)(obj))
  3. #defineROBJECT(obj)(R_CAST(RObject)(obj))
  4. #defineRCLASS(obj)(R_CAST(RClass)(obj))
  5. #defineRMODULE(obj)RCLASS(obj)
  6. #defineRFLOAT(obj)(R_CAST(RFloat)(obj))
  7. #defineRSTRING(obj)(R_CAST(RString)(obj))
  8. #defineRREGEXP(obj)(R_CAST(RRegexp)(obj))
  9. #defineRARRAY(obj)(R_CAST(RArray)(obj))
  10. #defineRHASH(obj)(R_CAST(RHash)(obj))
  11. #defineRDATA(obj)(R_CAST(RData)(obj))
  12. #defineRTYPEDDATA(obj)(R_CAST(RTypedData)(obj))
  13. #defineRSTRUCT(obj)(R_CAST(RStruct)(obj))
  14. #defineRBIGNUM(obj)(R_CAST(RBignum)(obj))
  15. #defineRFILE(obj)(R_CAST(RFile)(obj))
  16. #defineRRATIONAL(obj)(R_CAST(RRational)(obj))
  17. #defineRCOMPLEX(obj)(R_CAST(RComplex)(obj))
比之前多了TYPEDATA,RATIONAL,COMPLEX三个对象


Ruby 不变的对象

让我们看看结构化的那部分

  1. structRBasic{
  2. VALUEflags;
  3. constVALUEklass;
  4. }

以及Object


  1. structRObject{
  2. structRBasicbasic;
  3. union{
  4. struct{
  5. longnumiv;
  6. VALUE*ivptr;
  7. structst_table*iv_index_tbl;/*shortcutforRCLASS_IV_INDEX_TBL(rb_obj_class(obj))*/
  8. }heap;
  9. VALUEary[ROBJECT_EMBED_LEN_MAX];
  10. }as;
  11. };


还有Rstring

  1. structRString{
  2. structRBasicbasic;
  3. union{
  4. struct{
  5. longlen;
  6. char*ptr;
  7. union{
  8. longcapa;
  9. VALUEshared;
  10. }aux;
  11. }heap;
  12. charary[RSTRING_EMBED_LEN_MAX+1];
  13. }as;
  14. };

于是让我们回到

对象存在的必要条件

  1. 能够区分自身与其它(拥有标识)
  2. 能够响应请求(方法)
  3. 保持内部状态(实例变量)

  1. structRBasic{
  2. VALUEflags;
  3. constVALUEklass;
  4. }
这两部分。
  • flags是个多目的的标记,大多用以记录结构体的类型。
  • klass包含了这个对象归属的类。
最后,让我们看看Float是怎么说的
  1. structRFloat{
  2. structRBasicbasic;
  3. doublefloat_value;
  4. };
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics