2016-11-04 2 views
-1

は私が持っている:- ルビー

people=["Bob","Fred","Sam"] 

holidays = Hash.new 
people.each do |person| 
    a=Array.new 
    holidays[person]=a 
end 

gifts = Hash.new 
people.each do |person| 
    a=Array.new 
    gifts[person]=a 
end 

が不格好な感じ。私は初期化ブロックやsomesuch事でより合理的な方法を把握することはできません。ここには慣用的なアプローチがありますか?

lists["holidays","gifts",...] 

を...とリストの配列の各要素を初期化するために、それを介してitterate:

理想的には、私のような配列を維持したいと思います。

+0

'のような構造{ギフト:[]、休日:[]}各人は、それが人によって破壊休日、人によって贈り物と​​、逆の方法で構成有するより意味をなす可能性がある'のため。 – tadman

+0

これは割り当ての質問のようです。 –

答えて

-1

あなたが唯一のそのようなハッシュの数をしたい場合は、以下で十分です:

count_of_hashes = 4 // lists.count; 4 is chosen randomly by throwing a fair die 

people = ["Bob", "Fred", "Sam"] 

lists = count_of_hashes.times.map do 
    people.map {|person| [person, []]}.to_h 
end 

をこのコードはまた、配列を確保し、ハッシュのすべては、自分のメモリを占有します。

holidays, gifts, *rest = lists 
holidays["Bob"] << "Rome" 

、他のすべてのハッシュの値をチェックすること:

lists 
=> [ 
    {"Bob"=>["Rome"], "Fred"=>[], "Sam"=>[]}, 
    {"Bob"=>[], "Fred"=>[], "Sam"=>[]}, 
    {"Bob"=>[], "Fred"=>[], "Sam"=>[]}, 
    {"Bob"=>[], "Fred"=>[], "Sam"=>[]} 
    ] 
+1

わかりません。なぜn = 3ですか?なぜ3倍のマッパー? –

+0

nが、しかし、あなたは、初期化したい多くのそのようなハッシュです。 3×mapをn×mapに変更する必要がある。 –

+0

それを使う理由は全くありません。 'people'配列は直接再マッピングできます。 – tadman

1
people = %w|Bob Fred Sam| 
data = %w|holidays gifts| 

result = data.zip(data.map { people.zip(people.map { [] }).to_h }).to_h 
result['holidays']['Bob'] << Date.today 
#⇒ { 
# "holidays" => { 
#   "Bob" => [ 
#   [0] #<Date: 2016-11-04 ((2457697j,0s,0n),+0s,2299161j)> 
#   ], 
#  "Fred" => [], 
#   "Sam" => [] 
# }, 
#  "gifts" => { 
#   "Bob" => [], 
#  "Fred" => [], 
#   "Sam" => [] 
# } 
# } 

より洗練された例は次のようになります。

result = data.map do |d| 
    [d, Hash.new { |h, k| h[k] = [] if people.include?(k) }] 
end.to_h 

次のコードによって検証されるように後者は、「怠惰な初期化され、ネストされたハッシュ」を産生する。これは、ネストされたハッシュのためHash#new with a blockコンストラクタを使用しています。

は、それがどのように動作するかを確認するためにそれを再生します。

+0

興味深い。これは実際にハッシュのハッシュを作成すると思われます。私が求めているのではありませんが、私の目的にとっては実際には望ましいかもしれません。ありがとうございます –

+0

アップデートもご覧ください。 – mudasobwa

+0

ああありがとう。します。 –

0

それを行うの一般的な方法はEnumerable#each_with_objrectを使用することです。

holidays = people.each_with_object({}) { |p,h| h[p] = [] } 
    #=> {"Bob"=>[], "Fred"=>[], "Sam"=>[]} 

giftsは同じである。

+0

ああ、確かに 'people.map {| p | [p、[]]} .to_h'? – mudasobwa

+1

@ mudasobwa、私は奇妙な、私を呼び出すが、少なくとも他の方法が利用可能な場合は、バグ私にハッシュに配列を変換する何かがあります。文字列を配列に変換し、配列を操作して結合して文字列を生成するのと同じです。私は文字列を直接操作することができれば幸いです。 (私は眠りを失うことはありません...) –

+1

正直なところ、私は102%は同意しますが、私の中の怠け者の獣は常に "タイプが少ない"引数で戦いに勝ちます:) – mudasobwa