我是ruby语言的新手,所以当我尝试按值排序哈希时 我用这种方法排序:
movie_popularity.sort_by{|m,p| p}.reverse
但是sort方法返回一个数组,而我需要返回一个哈希,所以我使用了这个命令:
movie_popularity=Hash[*movie_popularity.sort_by{|m,p| p}.reverse.flatten]
我的问题是上述行中*
和flatten
的含义是什么?
谢谢=)
答案 0 :(得分:11)
*
被称为“splat operator”;我不确定我能否给你技术定义(虽然我确信你很快会在谷歌的帮助下找到它),但我描述它的方式是它基本上取代了手写多个代码中以逗号分隔的值。
为了使其更具体,请考虑您在示例中使用的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
模块(最值得注意的是{{} 1}}和Array
)提供枚举。在散列的情况下,您可能已经注意到,而不是像这样迭代:
Hash
相反,你这样做:
hash.each { |value| ... }
也就是说,迭代哈希会在每次迭代时产生两个值。因此,您自己的hash.each { |key, value| ... }
调用会返回一系列对。在此结果上调用sort_by
会将对折叠为一维值序列,如下所示:
flatten
答案 1 :(得分:2)
'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}