inject
一般寫法:
- result = []
- (1..10).each{|item| result << item}
result = []
(1..10).each{|item| result << item}
習慣寫法:
- (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的另一種通常用法就會更明白了:求和
- (1..10).inject{|sum, item| sum += item}
- 這個等於
- (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