Posted on 2009-05-24 12:46
dennis 閱讀(1757)
評論(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都應當是唯一的。