Ruby中的inject

來源:互聯網
上載者:User

剛接觸inject時,對其瞭解不是很深,直看到這篇文章 ruby-inject,才有了新的認識,文章配合大量例子進行說明。 
1、先看最簡單的求和例子,我們從這裡分析inject的實現機制。 

Ruby代碼  
  1. [1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10  


    inject帶有一個參數和block。block中的兩個參數是有含義的。第一個參數reslut在inject第一次執行block時把inject帶的參數付值給它,element就是數組中的元素,該例中inject一共執行4次block,每次執行block完後,最後語句的結果再付值給result,如此迴圈,直到遍曆數組中所有元素。我們深入這個例子看每一步執行的結果。 
因為數組有4個元素,所以要執行4次block操作: 
  第一次操作:result=0,既等於inject帶的參數;element=1,既第一個元素;執行block後result + element =1,再把這個結果付值給result,所以在執行完第一次block後,result = 1。 
  第二次操作:result=1,既上次運行block後的最後一條語句的結果;element=2,既第二個元素;執行block後付值result=3。 
如此類推,直到最後一次執行完block,生產的值為10。就是inject的傳回值了。 

    inject可以不帶參數,此時result的初始值為數組元素的第一個值。所以上例可改寫成: 

Ruby代碼  
  1. [1, 2, 3, 4].inject{ |result, element| result + element }  


這時執行block的次數為3次。 

    文章中還提到也其它用法: 

Ruby代碼  
  1. hash = [[:first_name, 'Shane'], [:last_name, 'Harvie']].inject({}) do |result, element|  
  2.   result[element.first] = element.last  
  3.   result  
  4. end  
  5.   
  6. hash # => {:first_name=>"Shane", :last_name=>"Harvie"}  


把array轉換成hash表。有也第一個例子的基礎,這個例子應該很容易看得懂。 

    再看一個例子,需要對一數組元素進行過濾並進行一些加工, 

Ruby代碼 
  1. [1, 2, 3, 4, 5, 6].select { |element| element % 2 == 0 }.collect { |element| element.to_s } # => ["2", "4", "6"]  


上面代碼實現選取數組中的偶數,並把它們轉換成字元型。用inject如何?呢? 

Ruby代碼  
  1. array = [1, 2, 3, 4, 5, 6].inject([]) do |result, element|  
  2.   result << element.to_s if element % 2 == 0  
  3.   result  
  4. end  
  5.   
  6. array # => ["2", "4", "6"]  


是不是更直觀? 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.