`
run_xiao
  • 浏览: 194188 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

比较对象

    博客分类:
  • Ruby
阅读更多
之前对Ruby中如何比较对象模棱两可,老想拿Java中的操作去套,发现很多时候行不通,今天花了点时间总算搞得比较清楚了

首先看看所有对象的父类Object包含的比较方法:     
===:类似于instanceof
=~:用于比较正则表达式,这两个都比较简单
而另外三个方法变化就比较多
==  eql?   equal? 三个方法原本在Object中定义的作用是一样的,都用来判断是否为同一对象,看看Object的C代码(object.c)
    rb_define_method(rb_mKernel, "==", rb_obj_equal, 1);
    rb_define_method(rb_mKernel, "equal?", rb_obj_equal, 1);
    rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1);

定义的三个方法调用了同一个c方法。

然而在RDoc中还有这样的解释:
引用

Unlike ==, the equal? method should never be overridden by subclasses: it is used to determine object identity (that is, a.equal?(b) iff a is the same object as b).

==方法可以子类中重载以提供同该class相符合的意义,而equal?不应该(should never)重载,以保证其本身的比较object_id的意义

这就解释了如下代码:
a = “a”
b = “a”
a == b 			#true
a.eql? b			#true
a.equal? b		#false


查看String的C代码(string.c)
    rb_define_method(rb_cString, "==", rb_str_equal, 1);
rb_define_method(rb_cString, "eql?", rb_str_eql, 1);


String有重载 == 和eql?方法,但未重载equal?,另外== 和eql?方法重写规则也不太一样,大概看了下C代码,最终一个调用rb_memcmp方法比较,一个调用memcmp,未仔细研究其差别。不过按Rdoc中所述,eql?应该和==同意,数字类型除外(Numeric),在Has中会调用该方法。
一直没搞懂ruby为什么要搞得这么复杂,自定义类时要遵从这些约定?不如Java来的简单明了。

另外,Ruby中还有个Comparable Module,它主要是根据<=>的结果(1,0或-1)提供<   <=   ==   >   >=   between?等方法的比较结果(true,false),所以在自定义的类中必须定义<=>方法,否则调用Comparable提供的方法时会报错
分享到:
评论
1 楼 不是流氓 2007-08-06  
顶一个,看明白了

相关推荐

    对象字段变化比较工具

    在IT行业中,尤其是在软件开发领域,经常会遇到需要比较对象或数据结构中字段变化的情况。"对象字段变化比较工具"就是为了解决这类问题而设计的。这个工具的主要目的是帮助开发者追踪和分析对象在不同时间点的字段值...

    Java对象属性数据比较,返回变化数据

    在Java编程中,比较对象属性的数据变化是一项常见的需求,特别是在数据跟踪、日志记录或版本控制等场景。本文将深入探讨如何实现这个功能,并基于给定的文件`PriceCheckDetail.java`和`ObjectCompareUtil.java`来...

    java对象比较器

    在Java编程中,比较对象是一个非常常见的需求,尤其是在排序或查找等操作中。本文将深入探讨一个自定义的Java对象比较器,并解释其工作原理及其实现细节。 #### 1. 概述 给定的代码实现了一个通用的比较器类`...

    复杂对象的比较

    为了比较对象的内容,我们需要重写这个方法。在重写时,应确保以下原则: - 自反性:对于任何非null的引用值x,`x.equals(x)`应该返回true。 - 对称性:如果x.equals(y)返回true,那么y.equals(x)也应该返回true。 ...

    计算机后端-Java-Java核心基础-第15章 面向对象07 21. 接口练习:比较对象大小.avi

    计算机后端-Java-Java核心基础-第15章 面向对象07 21. 接口练习:比较对象大小.avi

    utils-compare:用于在 JavaScript 中处理和比较对象的库

    用于在 JavaScript 中处理和比较对象的库 用于在 Node.js 中处理对象的实用微型库。 主要目的是提供对象比较和差异工具。 严格等于(更快)和差异(慢得多,但可用于生成关于两个对象(包括子数组)之间的每个差异的...

    php面向对象手册

    对象可以通过 `==` 或 `===` 运算符进行比较,但两者有不同的含义: - `==`:检查两个对象是否引用相同的类或具有相同的值(对于对象而言,通常是检查是否指向同一个内存地址)。 - `===`:除了检查类型相同外,还...

    java 子类对象赋值给父类对象的使用

    6. **equals()和==**:在比较对象时,`equals()`方法会检查对象的内容是否相等,而`==`则检查引用是否指向同一个对象。对于向上转型的对象,`equals()`方法会根据重写的情况来判断,而`==`始终比较引用。 7. **匿名...

    基于java中两个对象属性的比较

    默认情况下,equals()方法比较的是两个对象的内存地址是否相同,而不是比较对象的属性是否相同。因此,需要重写equals()方法以比较对象的属性。 情况二:判断相等并知道不同属性 在这种情况下,不仅需要判断两个...

    C#使用Equals()方法比较两个对象是否相等的方法

    在C#编程语言中,`Equals()`方法是一个用于比较对象是否相等的关键工具。这个方法在处理对象间的等价性判断时非常常见,特别是在需要确定两个变量或实例是否表示相同数据的情况下。`Equals()`方法是Object类的一个...

    MLDN魔乐JAVA_09深入引用、this关键字、对象比较.rar

    通过实例练习和案例分析,你将掌握如何正确比较对象,避免出现常见的错误,如误用`==`进行内容比较。 总的来说,“MLDN魔乐JAVA_09深入引用、this关键字、对象比较”这门课程将帮助你深化对Java核心特性的理解,使...

    asp.net保存信息对象比较

    在 ASP.NET 中,有几种主要的对象用于保存信息,包括 Application、Session、Cookie、ViewState 和 Cache。这些对象各有其特点,适用于不同的场景。 1. **Application 对象** Application 对象用于存储所有用户...

    面向对象学习笔记

    `==`仅比较对象是否具有相同的属性和值,而`===`则会检查对象是否完全相等(即是否指向同一个内存地址)。 总结来说,面向对象编程在PHP5中提供了强大的工具和支持,使开发者能够更好地组织代码、复用逻辑并创建...

    JAVA 对象数组按照多个属性进行排序

    `Comparable`是对象自身具备比较能力的接口,它定义了一个`compareTo()`方法,用于比较对象的自然顺序。而`Comparator`则是一个可以比较任何两个对象的接口,它包含一个`compare()`方法,可以根据我们自定义的规则来...

    深入理解持久化对象

    5. **重写equals()和hashCode()方法**:这有助于在集合中比较对象的相等性和唯一性,对于缓存管理和查询结果的处理至关重要。 #### 持久化对象的状态 持久化对象根据与Session的关系可以分为三种状态:瞬态、持久...

    python对象比较、拷贝、参数传递.zip

    2. `__lt__`方法:`操作符用于比较对象,调用这个方法确定一个对象是否小于另一个。 对于自定义类,如果不重写这些方法,Python将基于对象的内存地址进行比较,即比较的是引用而不是值。如果需要按照特定规则比较...

Global site tag (gtag.js) - Google Analytics