如何使用以下数组中的键初始化哈希?
keys = [ 'a' , 'b' , 'c' ]
Run Code Online (Sandbox Code Playgroud)
期望的哈希h应该是:
puts h
# { 'a' => nil , 'b' => nil , 'c' => nil }
Run Code Online (Sandbox Code Playgroud)
Aru*_*hit 11
我们在这里使用Enumerable#each_with_object和Hash::[].
keys = [ 'a' , 'b' , 'c' ]
Hash[keys.each_with_object(nil).to_a]
# => {"a"=>nil, "b"=>nil, "c"=>nil}
Run Code Online (Sandbox Code Playgroud)
或使用 Array#product
keys = [ 'a' , 'b' , 'c' ]
Hash[keys.product([nil])]
# => {"a"=>nil, "b"=>nil, "c"=>nil}
Run Code Online (Sandbox Code Playgroud)
另一个替代方案Array#zip:
Hash[keys.zip([])]
# => {"a"=>nil, "b"=>nil, "c"=>nil}
Run Code Online (Sandbox Code Playgroud)
更新:根据Arup Rakshit的建议,这里提出的解决方案之间的性能比较:
require 'fruity'
ary = *(1..10_000)
compare do
each_with_object { ary.each_with_object(nil).to_a }
product { ary.product([nil]) }
zip { ary.zip([]) }
map { ary.map { |k| [k, nil] } }
end
Run Code Online (Sandbox Code Playgroud)
结果:
Running each test once. Test will take about 1 second.
zip is faster than product by 19.999999999999996% ± 1.0%
product is faster than each_with_object by 30.000000000000004% ± 1.0%
each_with_object is similar to map
Run Code Online (Sandbox Code Playgroud)