首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hash与Hash失败的比较

Hash与Hash失败的比较
EN

Stack Overflow用户
提问于 2019-03-14 18:34:40
回答 2查看 3.1K关注 0票数 2

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

代码语言:javascript
复制
h1 = {a:1, b:2} 
h2 = {a:1, b:3} 
[h1, h2].sort ArgumentError: comparison of Hash with Hash failed

现在,奇怪的是,==eql?都是正常成功的。

代码语言:javascript
复制
h1==h2
=> false

h1.eql?(h2)
=> false

更奇怪的是,如果散列相同,数组上的排序就会成功:

代码语言:javascript
复制
h1= {a:1, b:2}
h2= {a:1, b:2}
[h1, h2].sort
=> [{:a=>1, :b=>2}, {:a=>1, :b=>2}]

我假设数组排序在内部不使用eql?。它有什么用?为什么会发生这种事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-14 18:36:27

排序取决于确定某物是更小、更大还是相等的能力,这被描述为可比的

散列是不可比较的,并使用两个散列返回零调用<=>

票数 2
EN

Stack Overflow用户

发布于 2019-03-14 18:43:12

排序使用宇宙飞船操作符<=>文档状态:

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

当您运行以下代码时,它将返回零:

代码语言:javascript
复制
{a:1, b:2} <=> {a:1, b:3}
#=> nil

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

代码语言:javascript
复制
[1] <=> [2]
#=> -1
[2] <=> [2]
#=> 0
[3] <=> [2]
#=> 1

因此,据我所知,这种做法是行不通的。

至于后一种情况,即相等散列数组,我不知道该方法在排序之前是否进行了相等检查。我已经看过源代码,虽然不知道C,所以也许更有知识的人可以证实或反驳这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55169782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档