rails ruby inject 使用類似於python reduce

inject
一般寫法:

Java代碼
  1. result = []  
  2. (1..10).each{|item| result << item}  
result = []
(1..10).each{|item| result << item}


習慣寫法:

Java代碼
  1. (1..10).inject([]){|array, item| array << item}  
(1..10).inject([]){|array, item| array << item}


inject有點難理解,相當於python的reduce和一些FP裏的fold。inject的塊變量有兩個(這裏是array和 item),第二個變量(item)用來枚舉被inject的集合(這裏是(1..10)這個range), 而第一個變量(array)由inject的參數初始化(這裏是[],可選),並在block被反覆執行時保持持久(相當於靜態變量),而item則在每 次枚舉時被更新爲下一個值。我們再看一下inject的另一種通常用法就會更明白了:求和

Java代碼
  1. (1..10).inject{|sum, item| sum += item}  
  2. 這個等於  
  3. (1..10).inject(0){|sum, item| sum += item}  
(1..10).inject{|sum, item| sum += item}
這個等於
(1..10).inject(0){|sum, item| sum += item}


也就是塊變量sum被初始化成0然後反覆迭代執行塊的內容,最後返回sum 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章