【问题标题】:Is there a specified enumeration order for hash keys as with hash values?与哈希值一样,哈希键是否有指定的枚举顺序?
【发布时间】:2019-03-19 04:41:29
【问题描述】:

Ruby 文档声明了 Hash#values:

哈希按照插入相应键的顺序枚举它们的值。

Hash#keys 似乎也是如此,但没有记录。

这可能仍然是真的吗?是否适用于所有键集?

【问题讨论】:

  • 简短回答,是的。枚举顺序遵循其他几种语言。这是它们被插入的顺序。但是,初始化后可以自行更改该顺序,在这种情况下,它将遵循新的顺序。
  • @CarlMarkham 这应该是我会选择它的答案:) 我特别想用它来获取方法中的哈希参数,因此在这种情况下哈希不会在调用者和方法之间转换.
  • 不管是不是真的,我从来没有遇到过要求在哈希中进行有序迭代的用例......为什么不使用正常的有序结构(数组)?
  • @maxpleaner 因为我正在查看发送到表示“命名参数”的方法调用的哈希值,并且 Hash#keys 按枚举顺序返回数组。
  • 我不明白为什么您需要以任何特定顺序查看“命名参数”,因为您可以通过名称识别它们......但我不会强调这一点跨度>

标签: ruby ruby-hash


【解决方案1】:

简短的回答,“未知”。

从 Ruby 1.9+ 开始,这似乎是正确的 但到目前为止,我还没有看到任何明确的“是”或“否”声明。

如果文档能指定它会很好。在 linux 实现的源代码中,出现了一个键值对列表是被遍历的内容,键、值和键:值迭代器遍历这个结构,在这种情况下,它们会以相同的顺序遍历,但是有没有声明这是否是 api 合约的一部分。

PK

【讨论】:

  • 您的声明有任何来源吗? OP 专门提出了这个问题,因为 official documentation 是模棱两可的,并且没有明确指定对键的迭代保留插入顺序,仅对值进行迭代。我还发现您声称它“遵循大多数其他语言”的说法令人怀疑,尤其是因为直到最近,Ruby 本身根本不保证散列的迭代顺序;这仅在 2007 年在 Ruby 1.9 中引入,例如,在 Python 中,dicts 仅保证不到 10 个月的迭代顺序。
  • 在 Java 和 .NET 中,标准 Dictionary 接口不保证迭代顺序,并且这些接口的标准实现没有定义顺序;您需要使用专门的实现来获得定义的迭代顺序。事实上,为以后的迭代记录插入顺序是额外的工作,需要额外的内存,使得插入、删除和迭代更慢,所以我自然希望大多数语言不会对迭代顺序做出任何保证.
  • 另外,Carl Markham 已经发布了this exact same answer,然后又删除了它,我认为这是因为他觉得他无法充分支持它。 再次复制并粘贴他的答案并不能使它更真实。
猜你喜欢
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2010-10-20
  • 2013-01-31
  • 2014-11-22
  • 2015-11-27
相关资源
最近更新 更多