public Method

Object.__id__

obj.__id__        fixnum
obj.object_id     fixnum

Document-method: object_id

Returns an integer identifier for obj. The same number will be returned on all calls to id for a given object, and no two active objects will share an id. Object#object_id is a different concept from the :name notation, which returns the symbol id of name. Replaces the deprecated Object#id.

Source Code

/*
*  call-seq:
*     obj.hash    => fixnum
*  
*  Generates a <code>Fixnum</code> hash value for this object. This
*  function must have the property that <code>a.eql?(b)</code> implies
*  <code>a.hash == b.hash</code>. The hash value is used by class
*  <code>Hash</code>. Any hash value that exceeds the capacity of a
*  <code>Fixnum</code> will be truncated before being used.
*/

VALUE
rb_obj_id(VALUE obj)
{
   /*
    *                32-bit VALUE space
    *          MSB ------------------------ LSB
    *  false   00000000000000000000000000000000
    *  true    00000000000000000000000000000010
    *  nil     00000000000000000000000000000100
    *  undef   00000000000000000000000000000110
    *  symbol  ssssssssssssssssssssssss00001110
    *  object  oooooooooooooooooooooooooooooo00        = 0 (mod sizeof(RVALUE))
    *  fixnum  fffffffffffffffffffffffffffffff1
    *
    *                    object_id space
    *                                       LSB
    *  false   00000000000000000000000000000000
    *  true    00000000000000000000000000000010
    *  nil     00000000000000000000000000000100
    *  undef   00000000000000000000000000000110
    *  symbol   000SSSSSSSSSSSSSSSSSSSSSSSSSSS0        S...S % A = 4 (S...S = s...s * A + 4)
    *  object   oooooooooooooooooooooooooooooo0        o...o % A = 0
    *  fixnum  fffffffffffffffffffffffffffffff1        bignum if required
    *
    *  where A = sizeof(RVALUE)/4
    *
    *  sizeof(RVALUE) is
    *  20 if 32-bit, double is 4-byte aligned
    *  24 if 32-bit, double is 8-byte aligned
    *  40 if 64-bit
    */
   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);
}
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.