myitem.inject({}) {|a,b| a[b.one] = b.two; a}
myitem是保持陣列或對對象(對對象具有在其中一個和兩個兩個字段)
我一個類我不確定上面的代碼應該做什麼?
myitem.inject({}) {|a,b| a[b.one] = b.two; a}
myitem是保持陣列或對對象(對對象具有在其中一個和兩個兩個字段)
我一個類我不確定上面的代碼應該做什麼?
從空映射開始,將b.one鍵的值設置爲b.two。
換句話說,對於「myitem」集合中的每個項目,創建一個映射條目。關鍵將是一個項目的「一個」價值。該地圖條目的值將是該項目的「兩個」值。
賦予「inject」的區塊會收到兩個參數。首先是「累加器」。在這種情況下,它的初始值是傳遞給「注入」的空映射。第二個參數是集合中的當前項目。在這種情況下,集合中的每個項目。
塊必須返回任何將用作下一個累加器值,在這種情況下,地圖。我們希望繼續使用相同的地圖,所以當我們完成後,「注入」方法將返回包含所有鍵/值對的地圖。
沒有保存注入的結果,它有點不值錢。
這是寫作的迂腐方式
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
等等
Hash[my_item.map {|object| [object.one, object.two]}]
是另一種方式來做到這一點。
那麼實際注射會是什麼樣子?實際的方法我的意思是 –
[使用來源](http://www.ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject)。 –
每件事都不起作用? –