庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

关于Object.object_id方法

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


只有注册用户登录后才能发表评论。


网站导航: