莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          關(guān)于Object.object_id方法

          Posted on 2009-05-24 12:46 dennis 閱讀(1762) 評論(0)  編輯  收藏 所屬分類: 動態(tài)語言
              Ruby中的Object.object_id是返回一個Fixnum類型的標(biāo)識符來代表一個對象。沒有兩個active的對象的object_id是一樣的,如:
          a="1.8.6"
          b
          ="1.8.6"
          a.object_id  
          => 24393910
          b.object_id  
          => 24390830
              盡管a==b,然而兩者的object_id是不同。
              但是這里有兩種例外情況,對于常量,哪怕你將它賦給不同的變量,它們的object_id是一樣的:

          a=RUBY_VERSION
          b
          =RUBY_VERSION
          a.object_id  
          => 21628310
          b.object_id  
          => 21628310

          C="hello" 
          a=C 
          b=C 
          a.object_id =>  24243480 
          b.object_id =>  24243480 
             
              除此之外,對于symbol類型,返回的也將是同一個object_id:

          a=:name
          b
          =:name
          a.object_id 
          => 34258
          b.object_id 
          => 34258
             
              為什么會出現(xiàn)這種情況?查看源碼可知:
          VALUE
          rb_obj_id(VALUE obj)
          {
           
             
          if (TYPE(obj) == T_SYMBOL) {
                 
          return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;
             }
             
          if (SPECIAL_CONST_P(obj)) {
                 
          return LONG2NUM((long)obj);
             }
             
          return (VALUE)((long)obj|FIXNUM_FLAG);
          }
              Object.object_id方法對這兩種情況做了特殊處理,常量和symbol都應(yīng)當(dāng)是唯一的。

          主站蜘蛛池模板: 万荣县| 东阿县| 介休市| 威信县| 夏津县| 丹阳市| 高阳县| 商南县| 万全县| 剑阁县| 东乌珠穆沁旗| 沁源县| 苏尼特右旗| 射洪县| 根河市| 高唐县| 汉寿县| 全椒县| 湖北省| 郁南县| 和龙市| 克山县| 东辽县| 裕民县| 辉县市| 宁阳县| 临泉县| 合水县| 威信县| 天台县| 贡嘎县| 嵊泗县| 潮州市| 鲜城| 安仁县| 庆阳市| 南开区| 阳城县| 五大连池市| 石棉县| 富蕴县|