之前对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提供的方法时会报错
分享到:
- 2007-07-30 17:26
- 浏览 1746
- 评论(1)
- 论坛回复 / 浏览 (0 / 2753)
- 查看更多
相关推荐
计算机后端-Java-Java核心基础-第15章 面向对象07 21. 接口练习:比较对象大小.avi
对象更改比较工具类,用于比较字段变化值,抛砖引玉,欢迎指正。
主要用于同一Java对象比较新旧变化数据,判断对象属性内容是否存在变更,并输出详细变更信息。
用于在 JavaScript 中处理和比较对象的库 用于在 Node.js 中处理对象的实用微型库。 主要目的是提供对象比较和差异工具。 严格等于(更快)和差异(慢得多,但可用于生成关于两个对象(包括子数组)之间的每个差异的...
asp.net保存信息对象比较 里面有对asp.net内函数的详细介绍 ,值得下载
5.6.3 提供一种复制和比较对象的方法 73 5.6.4 让作用域尽可能小 73 5.6.5 类应当对自己负责 74 5.7 设计时充分考虑可维护性 75 5.7.1 使用迭代 76 5.7.2 测试接口 76 5.8 使用对象持久性 78 5.9 小结 79 ...
Java对象实体类属性字段对比变化过程是指在一个Java对象实体类的生命周期中,其属性字段的变化...同时,Java对象实体类还可以提供相应的工具和方法来获取和比较对象的不同版本,以便更好地理解和管理对象的生命周期。
主要介绍了AngularJS API之equal比较对象的相关资料,需要的朋友可以参考下
但是,nl和n2的比较方法pareTo不正确,pareTo方法是比较对象的大小,而不是比较对象的值。因此,编译会出现错误。正确答案是D。 3. 关于接口的定义,interface前面没有abstract修饰,接口中的方法都是抽象的,因此...
用于处理间隔(可比较对象的范围)的 Python 工具。 间隔初始化 可以使用类构造函数、各种工厂方法或from_string类方法初始化间隔。 推荐的方法是使用工厂方法。 符号 定义 工厂方法 (a..b) {x | a ...
比较 比较对象。 比较(a, b) = a - b 对于 a = b,返回 0(相等)。 返回 - (负)a < b> b,返回 +(正)。安装 go get github.com/gomacro/compareimport "github.com/gomacro/compare"执照GPLv2 版本:v0.1
在 Java 中,"==" 运算符用于比较两个对象的引用是否相同,而不是比较对象的实际值。因此,当我们使用 "==" 运算符来比较两个 Integer 对象时,实际上是在比较这两个对象的引用是否相同,而不是比较它们的实际值。 ...
所有在反序列化Json字符串时需要一种通用的转换方式,而不是写死的某个类的反序列化,这里介绍的一种思路就是使用dynamic关键字来实现通用反序列化并比较反序列化后的对象是否深度相等即比较对象的各个字段是否相等...
比较list得到不同的对象 慎重注意list的大小变化和索引 精简算法
js数组数据和对象数据做比较,并改变数组的值
面向对象编程C++和Java比较教程 中英文完整版 pdf
简而言之,对象比较器是对象到对象的比较器,它允许逐个成员地递归比较对象,并为某些属性,字段或类型定义自定义比较规则。 对象比较器可以被认为是可以使用的框架,也可以被视为类似解决方案的起点。安装安装包...
实现复杂对象内部比较,类型中可以存在基本类型和List或者Map
Java对象的比较方式.doc
下面小编就为大家带来一篇基于java中两个对象属性的比较。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧