文字列の配列があります。
array = ["foo","bar","baz"]
これを変換しようとしているのは次のとおりです。
{"foo"=>nil, "bar"=>nil, "baz" => nil}
私はこれを次のように行ってきました:
new_hash = {}
array.each { |k| new_hash[k] = nil }
new_hash
ワンライナーで/インスタンス変数なしでこれを達成する方法があるかどうか疑問に思いました。
文字列の配列があります。
array = ["foo","bar","baz"]
これを変換しようとしているのは次のとおりです。
{"foo"=>nil, "bar"=>nil, "baz" => nil}
私はこれを次のように行ってきました:
new_hash = {}
array.each { |k| new_hash[k] = nil }
new_hash
ワンライナーで/インスタンス変数なしでこれを達成する方法があるかどうか疑問に思いました。
あなたが使用することができますHash[]
:
1.9.3p194 :004 > Hash[%w[foo bar baz].map{|k| [k, nil]}]
=> {"foo"=>nil, "bar"=>nil, "baz"=>nil}
またtap
1.9.3p194 :006 > {}.tap {|h| %w[foo bar baz].each{|k| h[k] = nil}}
=> {"foo"=>nil, "bar"=>nil, "baz"=>nil}
Hash[array.zip([nil].cycle)]
この答えは短すぎます。
一行で:
array.inject({}) { |new_hash, k| new_hash[k] = nil ; new_hash }
それは正確にはエレガントではありませんが、それは仕事を成し遂げます。
ただし、ハッシュをすでに初期化する必要がある理由はありますか?デフォルト値がnilのハッシュが必要な場合は、Hash.newでそれを実行できます。
Hash.new {|h, k| h[k] = nil}
array.each_with_object({}) { |i,h| h[i] = nil }