0

次の行を書くためのよりエレガントな方法があるかどうか疑問に思っていました:

section_event_hash = []
sections.each do |s|
   section_event_hash << { s => s.find_all_events }
end

キーが の要素で、値がメソッドsectionsによって返される要素の配列であるハッシュを作成したいと考えています。find_all_events

4

3 に答える 3

3

section_event_hash配列ではなくハッシュになりたい場合は、次を使用できますeach_with_object

section_event_hash = sections.each_with_object({}) { |s, h| h[s] = s.find_all_events }

を使用mapして配列の配列を作成し、それを次のようにフィードできますHash[]

section_event_hash = Hash[sections.map { |s| [s, s.find_all_events] }]
于 2012-11-21T05:20:26.013 に答える
1

あなたが投稿したコードは、あなたが望むことを完全に実行していません。次のようにテストして、詳しく見てみましょう。

sections = ["ab", "12"]

section_event_hash = []
sections.each do |s|
   section_event_hash << { s => s.split("") }
end

puts section_event_hash.inspect

与える:

[{"ab"=>["a", "b"]}, {"12"=>["1", "2"]}]

したがって、実際にはハッシュの配列を作成しました。各ハッシュには1つのキーと値のペアが含まれています。

次のコードは、複数の要素を持つ1つのハッシュを生成します。[]の代わりに{}を使用して空のハッシュが作成されることに注意してください。中括弧はハッシュの記号であり、角括弧は特定のキーを示します。

section_event_hash = {}
sections.each do |s|
   section_event_hash[s] = s.split("")
end

puts section_event_hash.inspect

=>{"ab"=>["a", "b"], "12"=>["1", "2"]}

それを行う「よりエレガントな」方法に関しては、それはあなたの定義に依存します。ここでの他の答えが示すように、通常、ルビーで何かをする方法は複数あります。seph'sは元のコードと同じデータ構造を生成し、mu'sは記述したハッシュを生成します。個人的には、読みやすく、理解しやすく、保守しやすいコードを目指しています。

于 2012-11-21T06:38:33.480 に答える
0
array_of_section_event_hashes = sections.map do |s|
  {s => s.find_all_events}
end
于 2012-11-21T05:21:15.417 に答える