莊周夢蝶

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

          關于Object.object_id方法

          Posted on 2009-05-24 12:46 dennis 閱讀(1762) 評論(0)  編輯  收藏 所屬分類: 動態語言
              Ruby中的Object.object_id是返回一個Fixnum類型的標識符來代表一個對象。沒有兩個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
             
              為什么會出現這種情況?查看源碼可知:
          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都應當是唯一的。

          主站蜘蛛池模板: 开化县| 乡宁县| 泸水县| 稷山县| 丰宁| 靖江市| 蕉岭县| 黄平县| 武隆县| 米泉市| 泽州县| 彭水| 股票| 宁河县| 烟台市| 邹平县| 南陵县| 中牟县| 姜堰市| 库伦旗| 平利县| 屏南县| 平陆县| 九寨沟县| 泗水县| 桦南县| 康马县| 青州市| 盈江县| 本溪市| 湘乡市| 怀仁县| 钟山县| 天水市| 珠海市| 永兴县| 中江县| 潢川县| 寻乌县| 郑州市| 卢湾区|