0

在 Ruby 1.9 中,Hash 是根据插入顺序进行排序的。为什么 Ruby koans 对 test_hash_is_unordered 方法的断言返回 true?

对我来说,该方法的标题非常具有误导性……也许它指的是 Ruby 将识别使用不同键顺序插入创建的 2 个相等的哈希值。

但是,从理论上讲,这种断言:

hash1 = { :one => "uno", :two => "dos" }
hash2 = { :two => "dos", :one => "uno" }

assert_equal ___, hash1 == hash2

应该返回假。或不?

4

2 回答 2

3

来自精美手册

hsh == other_hash → true or false

相等——如果两个散列都包含相同数量的键,并且每个键值对等于(根据Object#==)另一个散列中的对应元素,则它们是相等的。

因此,如果两个哈希具有相同的键/值对,则无论顺序如何,它们都被认为是相等的。

文档中的示例甚至包含以下内容:

h2 = { 7 => 35, "c" => 2, "a" => 1 }
h3 = { "a" => 1, "c" => 2, 7 => 35 }
h2 == h3   #=> true

是的,这个test_hash_is_unordered标题有点误导,因为没有专门测试顺序,只证明了关于平等的顺序。

于 2012-06-09T17:48:22.340 回答
0

我认为这只是在这种情况下“无序”意味着什么的问题。

作为一个人,如果它们不按顺序进行比较,我会发现很难比较两组。问题是我无法轻松匹配相同的元素并查看集合是否等效。除非这些集合碰巧以相同的顺序列出,否则我会认为它们是不平等的。这似乎也是你得出的结论。

然而,问题是集合的数学概念中项目的顺序根本不重要。无法对项目进行“排序”,因此如果两个集合包含相同的元素,则它们是相同的。设置的项目是无序的,但它们不是“乱序”;秩序的概念不适用。

我想这完全封装在表达式“hash_is_unordered”中,但这对我来说并不是很明显,至少!

于 2015-08-18T07:49:11.713 回答