今天,我遇到了一个有趣的问题:当对散列数组进行排序时,如果出现错误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?。它有什么用?为什么会发生这种事?
发布于 2019-03-14 18:36:27
排序取决于确定某物是更小、更大还是相等的能力,这被描述为可比的。
散列是不可比较的,并使用两个散列返回零调用<=>。
发布于 2019-03-14 18:43:12
排序使用宇宙飞船操作符<=>。文档状态:
..。比较a和b之间的比较,当b跟随a时返回小于0的整数,当a和b相等时返回小于0的整数,当a跟随b时返回大于0的整数。
当您运行以下代码时,它将返回零:
{a:1, b:2} <=> {a:1, b:3}
#=> nil然而,如果对数组执行相同的操作,则会得到正确的结果:
[1] <=> [2]
#=> -1
[2] <=> [2]
#=> 0
[3] <=> [2]
#=> 1因此,据我所知,这种做法是行不通的。
至于后一种情况,即相等散列数组,我不知道该方法在排序之前是否进行了相等检查。我已经看过源代码,虽然不知道C,所以也许更有知识的人可以证实或反驳这一点。
https://stackoverflow.com/questions/55169782
复制相似问题