2015-10-31 52 views
0

我有配對數組類型值,像這樣的值的哈希:紅寶石散列迭代中,索引訪問和值映射

someHash={:key1=>[element1a,element1b],:key2=>[element2a,element2b]} 

我試圖遍歷散列,訪問索引和修改散列的基於陣列類型值如下:

hash.each_with_index{|(key,array),index| 
    element1,element2 = array 
    element1 = "new value"; element2="new value2" 
} 
hash 

但是,當我返回散列時,更新沒有發生。是否有像我可以使用的陣列(或不同的解決方法)的map!方法的散列方法?

+0

歡迎來到Stack Overflow。你的變量叫做'someHash'。你的代碼永遠不會引用該變量。在Ruby中,我們使用snake_case來表示變量和類,而不是camelCase,所以使用'some_hash',但這個變量的更多助記符名稱是很好的。可用於枚舉的方法已有詳細記錄。請首先搜索這些問題,因爲通過閱讀文檔可以很容易地回答這個問題。 –

回答

1

你的代碼只是給一些局部變量賦值。您需要將新的值賦給哈希本身:(取決於你試圖實現什麼)

hash.each_with_index do |(key, array), index| 
    element1, element2 = array 
    element1 = "new value" 
    element2 = "new value2" 
    hash[key] = [element1, element2] 
end 

或更短:

hash.each do |key, array| 
    hash[key] = ["new value", "new value2"] 
end 

或者:

hash.update(hash) do |key, array| 
    ["new value", "new value2"] 
end 
+0

謝謝@spickermann!現在工作。 – Franz

0

當你做這個:

element1, element2 = array 

你是cre指向數組中的元素。當你後來這樣做:

element1 = "new value"; element2="new value2" 

你是設置那些指向新值的指針,因此不修改初始數組。

一種解決方案是:

hash.each_with_index do |(key,array),index| 
    array[0] = "new_value" 
    array[1] = "new value2" 
end 

hash 

我不過做這樣的事情,而不是:

hash.each do |key, array| 
    array[0] = "new_value" 
    array[1] = "new value2" 
end 

hash 
0

你不需要each_with_index。事實上,each_with_index不存在散列(鍵是索引)。你可以這樣做:

some_hash.each do |key, value| 
    value[0], value[1] = "new value", "new value2" 
end 
+0

從v1.9開始,您是否忘記了這一點?是否保留了散列的關鍵插入順序?有很多應用程序使用該屬性,所以如果想要散列的第i個鍵值對(儘管這裏不相關),這並不奇怪。順便說一句,許多老派編碼者從未接受過有序散列的概念。 –

+0

哦,是的,我一直在看1.9.3文檔。這是谷歌搜索中總是出現的東西。 – baron816

0

在你的代碼的問題是,你只改變了本地引用,而不是值在數組中。

您可以使用map這樣的:

new_hash = Hash[hash.map{|k,v| [k, ["new value","new value2"]]}] 

這不會改變原有的哈希值。