* 被称为“splat 运算符”;我不确定我能否给你技术定义(虽然我相信你会在谷歌的帮助下很快找到它),但我描述它的方式是它基本上取代了手写多个代码中的逗号分隔值。
为了更具体,请考虑您在示例中使用的Hash[] 的情况。 Hash 类有一个 [] 类方法,它接受可变数量的参数,通常可以这样调用:
# Returns { "foo" => 1, "bar" => 2 }
h = Hash["foo", 1, "bar", 2]
请注意,这不是一个数组、散列或我传入的任何东西;这是一个(手写的)值序列。 * 运算符允许您使用数组来实现基本相同的目标——在您的情况下,是 movie_popularity.sort_by{|m,p| p}.reverse.flatten 返回的那个。
至于flatten 调用:当您在哈希上调用sort_by 时,您实际上是在利用包含在各种类中的Enumerable 模块(最值得注意的是Array 和Hash)提供枚举。在哈希的情况下,您可能已经注意到,不是像这样迭代一个:
hash.each { |value| ... }
您可以这样做:
hash.each { |key, value| ... }
也就是说,对哈希进行迭代会在每次迭代中产生 两个 值。因此,您的 sort_by 调用本身将返回 pairs 序列。对此结果调用 flatten 会将这些对折叠为一维值序列,如下所示:
# Returns [1, 2, 3, 4]
[[1, 2], [3, 4]].flatten