【问题标题】:Ruby koans's assertion on test_hash_is_unorderedRuby koans 对 test_hash_is_unordered 的断言
【发布时间】:2012-06-13 08:28:41
【问题描述】:

在 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

应该返回假。还是不行?

【问题讨论】:

  • 顺序是保留,但在测试等价时它是“无序的”(即顺序无关紧要)。

标签: ruby hash


【解决方案1】:

来自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 标题有点误导,因为没有专门测试顺序,只演示了关于相等性的顺序。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2015-03-15
      • 1970-01-01
      • 2012-10-29
      • 2015-02-18
      相关资源
      最近更新 更多