Ruby:要散列的数组,没有任何局部变量

我有一个字符串数组。

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

我正在尝试将其转换为以下内容:

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

我一直用以下方法做到这一点:

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

我想知道是否有任何方法可以在单行/没有任何实例变量的情况下实现这一点。

这可行:

 new_hash = Hash[array.zip] # => {"foo"=>nil, "bar"=>nil, "baz"=>nil} 
  • array.zip返回[["foo"], ["bar"], ["baz"]]
  • 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 }