5

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

movie_popularity.sort_by{|m,p| p}.reverse

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

movie_popularity=Hash[*movie_popularity.sort_by{|m,p| p}.reverse.flatten]

我的问题是上面一行中的*和是什么意思?flatten

谢谢 =)

4

2 回答 2

11

*称为“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的各种类(最值得注意的是Arrayand )中的模块。Hash在散列的情况下,您可能已经注意到,不是像这样迭代一个:

hash.each { |value| ... }

相反,你这样做:

hash.each { |key, value| ... }

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

# Returns [1, 2, 3, 4]
[[1, 2], [3, 4]].flatten
于 2012-06-13T01:12:53.053 回答
3

'flatten' 使数组变平:http ://www.ruby-doc.org/core-1.9.3/Array.html#method-i-flatten

'*' 是 splat 运算符: http: //theplana.wordpress.com/2007/03/03/ruby-idioms-the-splat-operator/

最后一个网址中的相关位是这样的:

a = [[:planes, 21], [:cars, 36]]
h = Hash[*a]  # => { :planes=>21, :cars=>36}
于 2012-06-13T01:11:01.927 回答