2013-04-08 48 views
1

如何将[5, 6, 7]的每个元素赋值为row的值并使row变为{1=>5, 2=>6, 3=>7}向Hash.values赋值的数组的最佳方式是什么

row = {1=>0, 2=>1, 3=>0} 
#this following line doesn't work of course 
row.values = [5, 6, 7] 
#NoMethodError: undefined method `values=' for {1=>0, 2=>1, 3=>0}:Hash 
row 
#I want: {1=>5, 2=>6, 3=>7} 

回答

1
row.keys.zip([5, 6, 7]){|kv| row.store(*kv)} 
+0

谢谢,我决定使用'Hash [row.keys.zip([5,6,7])]''。 – randomor 2013-04-08 15:16:28

0
array = [5, 6, 7] 
Hash[*array.each_with_index.map{ |elem, idx| [idx + 1, elem]}.flatten] 

作为结果

{1=>5, 2=>6, 3=>7} 
+0

谢谢。也许我不清楚我的要求。更新。但哈希[*]很方便。 :) – randomor 2013-04-08 15:18:08

+0

@randomor没有问题,我已经更新了我的答案。 – toch 2013-04-08 15:26:30

2

一个通用的解决方案,为所述阵列中的任何长度的工作原理,并且使得元件中的散列关键是的索引:

Hash[row.each_with_index.map {|elem, i| [i, elem]}] 
0

您可以尝试以下操作:

row = {1=>0, 2=>1, 3=>0} 
p Hash[*(row.keys.zip([5, 6, 7]).flatten)] 

#=> {1=>5, 2=>6, 3=>7} 
相关问题