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