ruby - 为什么我们可以在 block 中使用数组索引来在ruby中进行哈希排序?

标签 ruby sorting hash

我可以对下面的散列进行排序:

h = {"a"=> 20, "b"=> 30 , "c" => 25}

通过使用这个:

h.sort { |a, b| b[1] <=> a[1] }

但是,我不明白这段代码为何或如何工作。 |a, b|ab代表的值是什么,它们从何而来?

sort 方法的文档没有提及这些问题。

最佳答案

Hash类从 Enumerable 继承其 sort 方法模块。可枚举状态的文档:

The Enumerable mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The class must provide a method each, which yields successive members of the collection.

因此,Enumerable 上的方法的实现依赖于 Enumerable 类的 each 方法被包含在其中。具体来说,它期望each 将产生该对象所代表的集合的成员。在这种情况下,Hash#each 的文档说:

each {| key, value | block } → hsh

Calls block once for each key in hsh, passing the key-value pair as parameters.

由于 Hash#each 为散列中的每个键值对生成 key, valueEnumerable 中的方法假定 key, value 是底层哈希中的“集合成员”(从某种意义上说,它是)。因此,Enumerable#sorta 生成 key, value,为 生成不同的 key, value b,因为 Enumerable#sort 在其实现中依赖于 Hash#each 产生的值。这就是您示例中 ab 的来源。

关于ruby - 为什么我们可以在 block 中使用数组索引来在ruby中进行哈希排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786723/

相关文章:

ruby-on-rails - Rails 使用 nokogiri 和 Mechanize 获取价格

Ruby 正则表达式不匹配

arrays - 将Perl数组排序到位

ruby-on-rails - 通过哈希值查找哈希数组的交集

ruby-on-rails - Ruby——自动初始化子类的类实例变量,不继承值

ruby - Nokogiri 没有从 Watir 加载 "browser"

javascript - 过滤、映射、排序和连接

java - java中的并发有序列表

c - 这将是均匀分布正态分布的最佳方法。将值放入桶中?

java - DigestUtils.md5Hex 返回相同的值