@elibinary
2016-11-13T02:27:42.000000Z
字数 766
阅读 659
Ruby
本篇来看下 Ruby 中的等价判断
和其它很多语言一样,在 Ruby 中也存在数种等价比较的方法,有时在不注意的时候就会因为对某种方法的误用得到意料之外的结果。这次就来把这几种方法扒拉扒拉清楚。
首先先来看看 '==' 和 'equal?'
'==' 很常用,也很简单,它的惯例行为是当两个对象表示相同的值时返回真值。就比如
'abc' == 'abc'
# => true
还有一点,平时经常会用到但是可能并没有注意到的是,很多表示数字的类在使用 '==' 操作符比较对象时通常会做类型的隐式转换。
1 == 1.0
# => true
而 'equal?' 方法就与此完全不同,就比如当你比较两个字符串时:
'abc' == 'abc'
# => true
'abc'.equal? 'abc'
# => false
发现它们并不相等。equal? 方法其实并不是比较的两个对象的内容和值,而是检查它们是否为同一个对象,也就是说当你使用 equal? 方法时,只有当两者具有相同的 object_id 时,返回值才为真,它其实检查的是两个对象的指针是否指向内存中的同一块地址。
还有一个方法 'eql?' ,这个方法可能你并没有显示的使用过它,但是它在 Hash 类中被广泛的用于比较对象的键,以确保同一个键不会被插入多次。
'eql?' 方法的默认行为和 'equal?' 是一样的,那么它在 Hash 类中到底是起什么作用呢,我们先来看另外一个方法 hash ,这个方法决定了将对象存在数据结构的什么地方。当两个对象表示相同的键时它们的 hash 方法应该返回相同的值,但是有时不同的对象在调用 hash 方法时也可能会返回相同的值,这就是哈希冲突,在这里就不过多阐述这方面相关的东西了。接下来说 eql? 方法,当 hash 值一致就会进一步通过 eql? 方法来确定其是否真的具有相同的键值。