我是 ruby 语言的新手,所以当我尝试按值对哈希进行排序时,我使用了这种方法进行排序:
movie_popularity.sort_by{|m,p| p}.reverse
但是 sort 方法返回一个数组,而我需要返回一个哈希,所以我使用了这个命令:
movie_popularity=Hash[*movie_popularity.sort_by{|m,p| p}.reverse.flatten]
我的问题是上面一行中的*
和是什么意思?flatten
谢谢 =)
被*
称为“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
and )中的模块。Hash
在散列的情况下,您可能已经注意到,不是像这样迭代一个:
hash.each { |value| ... }
相反,你这样做:
hash.each { |key, value| ... }
也就是说,对哈希进行迭代会在每次迭代中产生两个值。因此,您自己的sort_by
调用将返回一系列pairs。调用flatten
此结果会将对折叠成一维值序列,如下所示:
# Returns [1, 2, 3, 4]
[[1, 2], [3, 4]].flatten
'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}