Posted on 2009-05-24 12:46
dennis 阅读(1751)
评论(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都应当是唯一的。