2011-12-05 94 views

回答

1

從空映射開始,將b.one鍵的值設置爲b.two。

換句話說,對於「myitem」集合中的每個項目,創建一個映射條目。關鍵將是一個項目的「一個」價值。該地圖條目的值將是該項目的「兩個」值。

賦予「inject」的區塊會收到兩個參數。首先是「累加器」。在這種情況下,它的初始值是傳遞給「注入」的空映射。第二個參數是集合中的當前項目。在這種情況下,集合中的每個項目。

塊必須返回任何將用作下一個累加器值,在這種情況下,地圖。我們希望繼續使用相同的地圖,所以當我們完成後,「注入」方法將返回包含所有鍵/值對的地圖。

沒有保存注入的結果,它有點不值錢。

+0

那麼實際注射會是什麼樣子?實際的方法我的意思是 –

+0

[使用來源](http://www.ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject)。 –

+0

每件事都不起作用? –

1

這是寫作的迂腐方式

h = {} 
myitem.each { |b| h[b.one] = b.two } 

或更接近原來的代碼

a = {} 
mytem.each { |b| a[b.one] = b.two } 

(我personnaly討厭這種模式(和人民誰使用它),因爲它需要; a最後,失去了注入的所有功能方面(在'函數模式'中使用一個副作用函數,然後意識到後面的函數(a [..])不會返回期望的對象是錯誤的,IMO)。

進樣是正常使用中「摺疊」的列表到像

[1,2,3].inject(0) { |sum, x| sum+x } 
=> 6 # (0+1+2+3) 

這裏sum一個結果是該塊的最後一個呼叫的結果,x是列表上的每個值和0是初始值sum

[2,3].inject(10) { |p,x| p*x } 
=> 60 # 10*2*3 

等等

+0

注射是做什麼的?我真的不明白 –

+0

我應該使用一個而不是h。我編輯我的答案 – mb14

+0

它使用的原因是鏈接;每個不返回散列。 –

0
Hash[my_item.map {|object| [object.one, object.two]}] 

是另一種方式來做到這一點。