<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理
        Ruby的對(duì)象模型,包含在下面這張圖中:


        首先要知道,Ruby中的類也是對(duì)象,類相比于其他對(duì)象特殊的地方在于能夠產(chǎn)生對(duì)象,既然類是對(duì)象,那么它顯然也有類,也就是所謂類的類,這個(gè)類的類在Ruby中就是類的metaclass,圖中的(OtherClass),(OtherClass)就是類OtherClass的klass(C層次),(OtherClass)存儲(chǔ)了類的方法(類方法)和類的實(shí)例變量,并且是唯一的且不可實(shí)例化。在Ruby層次上我們想操作(otherclass)應(yīng)該類似:
      
    class OtherClass
      
    end
    class<<OtherClass
      attr_accessor:name 
    #name是OtherClass的實(shí)例變量
      def test
        p 
    'hello'
      end
    end
    OtherClass.name
    ='1'
    p OtherClass.name
    OtherClass.test
        圖中的instance是OtherClass的一個(gè)實(shí)例,那么顯然instance的class是OtherClass,可是圖中的(instance)又是什么呢?(instance)就是對(duì)象的singleton類,singleton類這個(gè)名稱怪怪的,不過每個(gè)對(duì)象只能有一個(gè)singleton類的角度上說也可以理解。看看下面的例子:
    class OtherClass
    end
    instance
    =OtherClass.new
    class<<instance
      
    def test
        p 
    "a.test"
      end
      attr_accessor:name
    end
    instance.test
    instance.name
    ="dennis"
    p instance.name

         instance通過OtherClass.new創(chuàng)建,但是此時(shí)(instance)還不存在,這與(OtherClass)情況不同,每個(gè)類一經(jīng)創(chuàng)建就有一個(gè)metaclass,而對(duì)象就不一樣,只有當(dāng)你通過class<<instance 語法創(chuàng)建的時(shí)候,(instance)才被創(chuàng)建。注意test方法和name變量都將是instance對(duì)象特有的,類OtherClass并沒有改變。觀察下,發(fā)現(xiàn)(instance)繼承于OtherClass,引出類的metaclass與對(duì)象的singleton類的又一個(gè)區(qū)別:類的metaclass繼承自父類的metaclass,而對(duì)象的singleton類則是繼承于對(duì)象的class。
        那么當(dāng)我們調(diào)用instance.class的時(shí)候,怎么不返回(instance)?這是c ruby在底層做了處理,instance的class在c ruby層次是(instance),當(dāng)查找的時(shí)候忽略了singleton類以及下面將要談到的include模塊的代理類,沿著繼承鏈上查找:
    86 VALUE
    87 rb_obj_class(obj)
    88 VALUE obj;
    89 {
    90 return rb_class_real(CLASS_OF(obj));
    91 }

    76 VALUE
    77 rb_class_real(cl)
    78 VALUE cl;
    79 {
    80 while (FL_TEST(cl, FL_SINGLETON) || TYPE(cl) == T_ICLASS) {
    81 cl = RCLASS(cl)->super;
    82 }
    83 return cl;
    84 }

    (object.c)

    核心代碼就是:
    while (FL_TEST(cl, FL_SINGLETON) || TYPE(cl) == T_ICLASS) {
      cl = RCLASS(cl)->super;
     }
        其中FL_TEST(cl,FL_SINGLETON)用于測試是否是singleton類,而TYPE(cl)==TL_ICLASS是否是包含模塊的代理類,TL_ICLASS的I就是include的意思。
        圖中類OtherClass繼承Object,這個(gè)是顯而易見的,不再多說。而Object、Class和Module這三個(gè)類是沒辦法通過API創(chuàng)建的,稱為元類,他們的之間的關(guān)系如圖所示,Object的class是Class,Module繼承Object,而Class又繼承Module,因此Class.kind_of? Object返回true,這個(gè)問題類似先有雞,還是先有蛋的問題,是先有Object?還是先有Class?而c ruby的解決辦法是不管誰先有,創(chuàng)建Object開始,接著創(chuàng)建Module和Class,然后分別創(chuàng)建它們的metaclass,從此整個(gè)Ruby的對(duì)象模型開始運(yùn)轉(zhuǎn)。

    1243 rb_cObject = boot_defclass("Object", 0);
    1244 rb_cModule = boot_defclass("Module", rb_cObject);
    1245 rb_cClass = boot_defclass("Class", rb_cModule);
    1246
    1247 metaclass = rb_make_metaclass(rb_cObject, rb_cClass);
    1248 metaclass = rb_make_metaclass(rb_cModule, metaclass);
    1249 metaclass = rb_make_metaclass(rb_cClass, metaclass);

    (object.c)

    那么當(dāng)我們調(diào)用Class.class發(fā)生了什么?Class的klass其實(shí)指向的是(Class),可根據(jù)上面的代碼,我們知道會(huì)忽略這個(gè)(Class),繼續(xù)往上找就是(Module),同理找到(Object),而(Object)繼承自Class,顯然Class的類仍然是Class,Class的類的類也是Class,多么有趣。同理,Object.class和Module.class都將是Class類。

        再來看看include模塊時(shí)發(fā)生的故事。include模塊的過程如下圖所示:

    include模塊,本質(zhì)上是在對(duì)象或者類的klass和super之間插入了一個(gè)代理類iclass,這個(gè)代理類的方法表(m_table)和變量表(iv_table)分別指向了被包含的模塊的方法表和變量表(通過指針,因此當(dāng)包含的Module變化的時(shí)候,對(duì)象或者類也能相應(yīng)變化),那么在查找類或者對(duì)象的class的時(shí)候,上面已經(jīng)說明將忽略這些代理類。



    主站蜘蛛池模板: 免费观看黄色的网站| 日韩精品无码永久免费网站| 1区1区3区4区产品亚洲| 亚洲精品色午夜无码专区日韩| 亚洲第一成人影院| 又黄又爽一线毛片免费观看| 国产免费人成在线视频| 亚洲av午夜成人片精品电影| 亚洲毛片不卡av在线播放一区| 国产午夜亚洲精品午夜鲁丝片| 亚洲色欲一区二区三区在线观看| 亚洲乱色熟女一区二区三区丝袜| 国产精一品亚洲二区在线播放| 亚洲国产精品成人精品无码区| 亚洲AV人无码激艳猛片| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲an日韩专区在线| 亚洲色大成网站www永久网站| 日韩国产欧美亚洲v片| 成人免费观看男女羞羞视频| 精品国产呦系列在线观看免费| a级成人毛片免费图片| 免费播放一区二区三区| 日韩不卡免费视频| 日韩午夜免费视频| 亚洲午夜精品久久久久久浪潮 | 一级毛片不卡片免费观看| 亚欧免费一级毛片| 色窝窝免费一区二区三区| 成人免费777777| 亚洲人成网站18禁止一区 | 日韩高清在线免费看| 亚洲第一网站男人都懂| 亚洲AV永久无码区成人网站 | 五月婷婷亚洲综合| 国产精品亚洲A∨天堂不卡| 亚洲福利一区二区三区| 亚洲狠狠色丁香婷婷综合| 成人a毛片免费视频观看| 免费无遮挡无码永久视频| 在线免费观看一级片|