天天看點

關于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