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}
于 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.each_with_object({}) { |i,h| h[i] = nil }
于 2012-07-23T21:51:06.943 回答
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 回答