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

你可能感兴趣的:(关于Object.object_id方法)