什么是*的平均值并且在红宝石中变平

use*_*250 5 ruby flatten

我是ruby语言的新手,所以当我尝试按值对哈希进行排序时,我使用此方法进行排序:

movie_popularity.sort_by{|m,p| p}.reverse
Run Code Online (Sandbox Code Playgroud)

但是sort方法返回一个数组,而我需要返回一个哈希,所以我使用了这个命令:

movie_popularity=Hash[*movie_popularity.sort_by{|m,p| p}.reverse.flatten]
Run Code Online (Sandbox Code Playgroud)

我的问题是什么,*flatten在上面的行?

谢谢=)

Dan*_*Tao 11

*被称为"图示符"; 我不确定我能否给你技术定义(虽然我确信你很快会在谷歌的帮助下找到它),但我描述它的方式是它基本上取代了手写多个代码中以逗号分隔的值.

为了使其更具体,请考虑Hash[]您在示例中使用的情况.的Hash类有一个[]类方法,该方法采用可变数目的参数,并通常可以称为是这样的:

# Returns { "foo" => 1, "bar" => 2 }
h = Hash["foo", 1, "bar", 2]
Run Code Online (Sandbox Code Playgroud)

请注意,这不是数组或哈希或我传入的任何内容; 它是一个(手写的)值序列.该*运营商允许你基本实现使用数组同样的事情-在你的情况下,一个返回的movie_popularity.sort_by{|m,p| p}.reverse.flatten.

至于该flatten呼叫:当你调用sort_by一个散列,你真的撬动Enumerable包含在各种类(最显着的模块ArrayHash)提供枚举.在哈希的情况下,您可能已经注意到,而不是像这样迭代一个:

hash.each { |value| ... }
Run Code Online (Sandbox Code Playgroud)

相反,你这样做:

hash.each { |key, value| ... }
Run Code Online (Sandbox Code Playgroud)

也就是说,迭代哈希会在每次迭代时产生两个值.因此,您自己的sort_by调用将返回一系列.调用flatten此结果会将对折叠为一维值序列,如下所示:

# Returns [1, 2, 3, 4]
[[1, 2], [3, 4]].flatten
Run Code Online (Sandbox Code Playgroud)