关于Object.object_id方法

  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

时间: 2024-09-20 06:14:11

关于Object.object_id方法的相关文章

compareto-Java 分数比较compareTo(Object obj)方法

问题描述 Java 分数比较compareTo(Object obj)方法 要求:1. 不能用分子除与分母的结果来比较大小,这样不精确.2.分母为零分子为正数时分数为无穷大,两个无穷大的数相等,无穷大的数大于一切其他数:分母为零分子为负数时分数为负无穷大,两个负无穷大的数相等,负无穷小于一切其他数.3. 正无穷大大于负无穷大,两个负无穷大的分数一样大,两个正无穷大的分数一样大.谢谢指导. 解决方案 假设你的分数类class fraction implements Comparable{publi

javascript object array方法使用详解_javascript技巧

Array.prototype.push push向数组尾部添加一项并更新length ,返回数组长度. 如果Object使用push会怎样? 看下面代码, obj好像数组一样工作了.length会自动更新. 复制代码 代码如下: var push = Array.prototype.push; var obj = {}; push.call(obj, "hello"); // 返回值 1 // obj {"0":"hello", length:

Javascript创建自定义对象:创建Object实例添加属性和方法

文章简介:创建自定义对象的最简单的方式就是创建一个Object实例,然后再为它添加属性和方法. 创建自定义对象的最简单的方式就是创建一个Object实例,然后再为它添加属性和方法,如下所示: var person = new Object(); person.name = "Nicholas"; person.age = "29" person.job = "Software Engineer"; person.sayName = functio

如何将XML与OBJECT进行相互转换(泛型以及通用方法)

对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用,个人感觉还是比较爽的,架构不错.它包括了SQL SERVER 2000,SQL SERVER 2005以及ORACLE的相关C#代码的生成.比哥一年前写的那个牛多了,哈哈,哥去年乱写了个网页版的(http://www.cnblogs.com/jasenkin/archive/2010/02/11/1667511.html),现在看一年前的代码,哥感叹,这个谁写的代码,TMD实在写的太烂了!!!当然,ORMCodeHel

Object.wait()的使用方法示例(转)

本文节选自 Effective Java by Joshua Bloch 和 Concurrent Programming in Java by Doug Lea.   1.3 原子数据的同步    java语言保证读或写一个变量是原子(atomic)的,除非这个变量的类型是long或double.换句话说,读入一个非long或double类型的变量,可以保证返回值一定是某个线程保存在该变量中的,即使多个线程在没有同步的时候并发地修改这个变量,也是如此.       虽然原子性保证了一个线程在读

对Object类中方法的深入理解

看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类. 所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什么应用呢? 这个问题也经常出现在面试中,如果平时没有关注,可能很难回答好,这里简单整理一下. 首先看一下java.lang.Object的源码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2

JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法_javascript技巧

1.Object类 在JS中,Object是所有类的基类,使用Object类来创建自定义对象时,可以无需定义构造函数(constructor,prototype,hasOwnProperty(property)) var per = new Object(); per.name = 'zhangsan'; per.age = ; alert(per.name + per.age); 我们想在程序中得到一个对象变量,只要能存储大量数据即可,这个时候,我们可以考虑使用Object类.Object类避

[Google Guava] 1.3-常见Object方法

原文链接 译者: 沈义扬 equals 当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查.使用Objects.equal帮助你执行null敏感的equals判断,从而避免抛出NullPointerException.例如: 1 Objects.equal("a", "a"); // returns true 2 Objects.equal(null, "a"); // retur

一起谈.NET技术,如何将XML与OBJECT进行相互转换(泛型以及通用方法)

对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用,个人感觉还是比较爽的,架构不错.它包括了SQL SERVER 2000,SQL SERVER 2005以及ORACLE的相关C#代码的生成.比哥一年前写的那个牛多了,哈哈,哥去年乱写了个网页版的(http://www.cnblogs.com/jasenkin/archive/2010/02/11/1667511.html),现在看一年前的代码,哥感叹,这个谁写的代码,TMD实在写的太烂了!!!当然,ORMCodeHel