使用Ruby 2.1(使用ActiveSupport 3.x,如果有帮助),我想转换这样的数组:
[ :apples, :bananas, :strawberries ]
进入这样的哈希:
{ :apples => 20, :bananas => 20, :strawberries => 20 }
从技术上讲,这有效:
array = [ :apples, :bananas, :strawberries ]
hash = Hash[array.zip(Array.new(array.length, 20))]
# => {:apples=>20, :bananas=>20, :strawberries=>20}
但这看起来很笨重,我觉得有一种更简单的方法可以做到这一点。有吗?
我查看了Enumerable#zip以及Hash#new的默认值选项,但没有看到任何提供此转换的简单方法。
答案 0 :(得分:3)
使用Hash[]
:
Hash[array.map { |f| [f, 20] }]
答案 1 :(得分:3)
我认为Array#product
会对此有所帮助:
ary = [ :apples, :bananas, :strawberries ]
Hash[ary.product([20])]
# => {:apples=>20, :bananas=>20, :strawberries=>20}
答案 2 :(得分:3)
另一个答案:
ary = [ :apples, :bananas, :strawberries ]
Hash[[*ary.each_with_object(20)]]
# => {:apples=>20, :bananas=>20, :strawberries=>20}
或者(正如OP指出的那样):
ary.each_with_object(20).to_h
# => {:apples=>20, :bananas=>20, :strawberries=>20}
基本上,调用each_with_object
会返回一个Enumerator
对的对象,这些对包含每个值和数字20(即[:apples, 20], ...
),后者可以随后转换为散列。