2013-11-04 49 views
0

除了傳遞參數和綁定之外,是否有任何方法來改變塊/方法內傳遞的對象,以使更改反映在初始對象中?在Ruby中通過引用傳遞

想象的要求是轉換如下:

{one:1, two:2, three:3, four:4}{one:"1", two:"22", three:"333", four:"4444"}

我在想是這樣的:

{one:1, two:2, three:3, four:4}.each!{ |k,v| v = v.to_s * v }

凡更改傳遞的變量得到體現在實際的散列。

我認爲它可能甚至有這樣的能力?因此,塊可以直接對這些對象進行處理,而無需創建新對象,然後將其分配給它。

不知怎的覺得解決這個問題這樣涉及對象數據類型的多個不必要的變化,可能是低效的:

new_hash = Hash[{one:1, two:2, three:3, four:4}.collect{ |k,v| [k, v.to_s * v] }]

所以想知道,是否有像每一個東西!去做吧。

+1

我有點困惑你想要完成的任務。在你給定的例子中,你是否想要改變原始散列,或者改變散列中的值?鑑於前者,爲什麼不只是「收集!」而不是「收集」? – micahbf

+0

我試圖改變散列值,但似乎沒有辦法實現這一點。 –

回答

2

我不知道這樣的事情each!,但要做到你想做什麼:

test = {one:1, two:2, three:3, four:4} 

test.each{ |key,val| test[key] = val.to_s * val } 

p test 

#=> {:one=>"1", :two=>"22", :three=>"333", :four=>"4444"} 
+0

那麼,我知道像這樣突變原始哈希。但是正在尋找一個通用塊(用作Proc/Lambda)來做到這一點,這就不需要依賴性來明確地在塊中進行「測試」。 –