5

私はRuby言語が初めてなので、ハッシュを値でソートしようとしたときに、このメソッドを使用してソートしました:

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

ただし、ソートメソッドは配列を返しますが、ハッシュを返す必要があるため、次のコマンドを使用しました。

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

私の質問は、上記の行の*andの意味は何ですか?flatten

ありがとう =)

4

2 に答える 2

11

これ*は「splat オペレーター」と呼ばれます。技術的な定義を提供できるかどうかはわかりませんが (Google の助けを借りればすぐに見つけられると思いますが)、基本的に複数の手書きの代わりになるということです。コード内のコンマ区切り値。

これをより具体的にするため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| ... }

つまり、ハッシュを反復すると、各反復で2 つの値が得られます。したがって、sort_by独自の呼び出しは一連のペアを返します。flattenこの結果を呼び出すと、次のようにペアが 1 次元の値のシーケンスに折りたたまれます。

# 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

「*」はスプラット演算子です: http://theplana.wordpress.com/2007/03/03/ruby-idioms-the-splat-operator/

最後の URL の関連ビットは次のとおりです。

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