哈希与哈希的比较失败

时间:2019-03-14 18:34:41

标签: ruby

今天我遇到了一个有趣的问题: 对散列数组进行排序时,它失败,并显示错误comparison of Hash with Hash failed。示例:

h1 = {a:1, b:2} 
h2 = {a:1, b:3} 
[h1, h2].sort ArgumentError: comparison of Hash with Hash failed

现在,奇怪的是==eql?都成功地完成了。

h1==h2
=> false

h1.eql?(h2)
=> false

更奇怪的是,如果哈希相同,则数组上的排序成功:

h1= {a:1, b:2}
h2= {a:1, b:2}
[h1, h2].sort
=> [{:a=>1, :b=>2}, {:a=>1, :b=>2}]

我认为数组排序在内部不使用eql?。它有什么用?为什么会这样呢?

2 个答案:

答案 0 :(得分:2)

排序取决于确定某事物是较小,较大还是相等的能力,该能力被描述为Comparable

哈希值不可比,使用两个哈希值调用<=>会返回nil。

答案 1 :(得分:0)

排序使用宇宙飞船运算符<=>docs状态:

  

... a和b之间的比较,当b跟随a时返回小于0的整数,当a和b相等时返回0或当a跟随b时返回大于0的整数

运行以下命令时,它返回nil:

{a:1, b:2} <=> {a:1, b:3}
#=> nil

如果对数组执行相同操作,则会得到正确的结果:

[1] <=> [2]
#=> -1
[2] <=> [2]
#=> 0
[3] <=> [2]
#=> 1

据我所知,排序无法正常工作。

对于后一种情况,是一个相等的哈希数组,我想知道该方法是否在排序之前进行相等性检查。我已经看过源代码,虽然不了解C,所以也许更有知识的人可以确认或驳斥它。

相关问题