在Ruby 1.9中,哈希是根据插入顺序排序的。为什么Ruby koans对test_hash_is_unordered方法的断言返回true?
对我来说,方法的标题是非常误导的...也许它指的是Ruby将识别使用不同键顺序创建的2个相等的哈希值。
但是,理论上,这种断言:
hash1 = { :one => "uno", :two => "dos" }
hash2 = { :two => "dos", :one => "uno" }
assert_equal ___, hash1 == hash2
应该返回false。或不?
来自fine manual:
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
标题有点误导,因为订单没有专门测试,只有关于平等的订单才被证明。
我认为这只是一个“无序”在这种背景下意味着什么的问题。
作为一个人,如果它们不合适,我会发现很难比较两组。问题是我无法轻易匹配相同的元素并查看集合是否相同。除非这些集合恰好以相同的顺序列出,否则我认为它们是不相等的。这似乎是你来的结论。
然而,事实是,集合的数学概念中的项目顺序简直不重要。没有办法“订购”这些项目,因此如果它们包含相同的元素,则两个集合是相同的。设定项目是无序的,但它们不是“乱序”;订单的概念不适用。
我认为这完全封装在表达式'hash_is_unordered'中,但至少对我来说并不是很明显!