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