今天我遇到了一个有趣的问题:
对散列数组进行排序时,它失败,并显示错误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?
。它有什么用?为什么会这样呢?
答案 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,所以也许更有知识的人可以确认或驳斥它。