2014-01-21 43 views
4

閱讀各種解釋這裏SO之間的差異,他們已經這樣描述:紅寶石:地圖和注入


地圖:

The map method takes an enumerable object and a block, and runs the block for each element


進樣:

Inject takes a value and a block, and it runs that block once for each element of the list.

希望你明白爲什麼我覺得他們看起來很相似o表面。我什麼時候會選擇一個,他們之間有什麼明顯的區別?

+11

您是否試過閱讀['map']的官方文檔(http://www.ruby-doc.org/core-2.1.0/Enumerable.html#method-i-map)和['inject' ](http://www.ruby-doc.org/core-2.1.0/Enumerable.html#method-i-inject)? – toro2k

+2

我認爲downvotes是沒有根據的。如果在SO之前沒有被問到過,那麼即使是最基本的核心語言文檔,SO也樂意重複。通常,各種答案使用不同的措詞來解釋相同的事情,即使他們沒有在想法方面添加任何新東西。有時這對於直觀地理解概念非常有幫助。 另外,對於我認爲簡單而無聊的事情,SO中的答案帶來了意想不到的微妙之處,我感到驚訝。 所以是的,RTFM,但然後來到SO,並問以前沒有問過它。 – labyrinth

回答

7

如果您認爲inject也被別名爲reduce,它會有所幫助。 map用於變換列表,例如,將數組中的所有字符串轉換爲大寫,而inject接受一個參數(通常是一個累加器)並對其進行修改。

例子:

%w(a b c).map(&:upcase) #=> ["A", "B", "C"] 
[*1..4].inject(:+) #=> 10 

如果你想了解更多,什麼inject也被稱爲fold

+1

你的方式使它更容易理解概念。謝謝! – krystah

+0

對於本質上是一個聚合函數的東西,我發現它更具可讀性和直觀性,可以做'(1..4).sum#=> 10' – nroose

+0

@nroose這個問題沒有標籤Rails。 '(1..4).sum#=> NoMethodError:未定義的方法'sum'for 1..4:Range' in plain Ruby。 –

4

inject以一個對象作爲參數,並做了一些操作並返回該修改後的對象。

arr = [] 
[1,2].inject(arr) { |s,e| s << e } 
arr # => [1,2] 

在上面的例子,見我通過空數組arr,但調用#inject,塊內後我沒有concatenation操作和該arr。之後,我打印它,我可以看到arr現在保存條目,這是1,2

map創建一個新的Enumerable對象,該對象基於您調用它的接收器Enumerable對象創建。這將需要每個元素從reciever,並會做一些操作,將投入新的可枚舉元素,那麼下一個和下等..

arr = [1,2] 
arr.map { |e| e + 1 } # => [2,3] 
arr # => [1,2] 

隨着#map,塊正在每個參數和它遞增通過1,增加的值,它將相同的索引放在新數組中,從哪個索引取出原始元素。但最終的數組是一個新的數組,它與arr沒有任何關係。當我做了p arr,我在arr中得到了與開始#map操作前相同的內容。

+1

+1簡潔,非常有幫助! – fyz

3

隨着inject你通常返回一個值(通常用於數學),而與地圖你正在返回一個數組。

+1

...雖然人們經常看到'a.inject([])'和'({})', –

+0

我發現注入非常混亂,而且地圖更加直觀。如果你只是總結一些東西,然後在陣列上使用每個或一個聚合函數。 – nroose