2013-04-08 71 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} 
相關問題