2

文字列の配列があります。

array = ["foo","bar","baz"]

これを変換しようとしているのは次のとおりです。

{"foo"=>nil, "bar"=>nil, "baz" => nil}

私はこれを次のように行ってきました:

new_hash = {}
array.each { |k| new_hash[k] = nil }
new_hash

ワンライナーで/インスタンス変数なしでこれを達成する方法があるかどうか疑問に思いました。

4

5 に答える 5

12

これはうまくいくでしょう:

new_hash = Hash[array.zip]
# => {"foo"=>nil, "bar"=>nil, "baz"=>nil}
  • array.zip戻り値[["foo"], ["bar"], ["baz"]]
  • Hash::[]これらのキーからハッシュを作成します
于 2012-07-23T21:36:19.923 に答える
2

あなたが使用することができます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} 
于 2012-07-23T21:35:25.717 に答える
1
Hash[array.zip([nil].cycle)]

この答えは短すぎます。

于 2012-07-23T21:52:43.477 に答える
0

一行で:

array.inject({}) { |new_hash, k| new_hash[k] = nil ; new_hash }

それは正確にはエレガントではありませんが、それは仕事を成し遂げます。

ただし、ハッシュをすでに初期化する必要がある理由はありますか?デフォルト値がnilのハッシュが必要な場合は、Hash.newでそれを実行できます。

Hash.new {|h, k| h[k] = nil}
于 2012-07-23T21:33:51.750 に答える
0
array.each_with_object({}) { |i,h| h[i] = nil }
于 2012-07-23T21:51:06.943 に答える