关于Object.object_id方法

  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都应当是唯一的。

文章转自庄周梦蝶  ,原文发布时间2009-05-24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值