2011-02-15 20 views
10

工作,我覺得在這的Ruby代碼是相當有趣的如何 「(1..4).inject(:+)」 在Ruby中

(1..4).inject(&:+) 

好吧,我知道什麼inject呢,我知道這個代碼基本上相當於

(1..4).inject(0) {|a,n| a + n} 

但它究竟如何工作?

爲什麼&:+相同寫入塊{|a,n| a + n}

爲什麼它不需要初始值?我確定與inicial值爲0,但(1..4).inject(&:*)也適用,並且有初始值必須是1 ...

+8

這真是兩個完全不同的問題,其中第一個的是,其上已經不下11個其他問題重複問及在這裏找到答案在計算器上:http://StackOverflow.Com/q/99318/ http://StackOverflow.Com/q/1217088/ http://StackOverflow.Com/q/1792683/ http://StackOverflow.Com/q/1961030/http://StackOverflow.Com/q/2096975/ http://StackOverflow.Com/q/2211751/ http://StackOverflow.Com/q/2259775/ http://StackOverflow.Com/q/2388337/http://StackOverflow.Com/q/2697024/ http://StackOverflow.Com/q/3888044/ http://StackOverflow.Com/q/4512587/ – 2011-02-15 18:46:50

回答

14

Ruby documentation

如果指定一個符號來代替,然後每個元素集合中的將被傳遞到備忘錄的命名方法

所以,指定一個符號等效於傳遞以下塊: {|memo, a| memo.send(sym, a)}

如果你不明確指定備忘錄的初始值,然後使用收集的第一個元素作爲備忘錄的初始值。

所以,沒有魔法,Ruby只是將第一個元素作爲初始值,並從第二個元素開始注入。您可以通過編寫[].inject(:+)來檢查它:它返回nil而不是[].inject(0, :+)返回0.

編輯:我沒有注意到符號。你不需要它,inject將與一個符號一起工作。但是,如果你把它寫,符號轉換成塊,它可以是有用的與other methods

+1

+1。你可以添加一個解釋爲什麼&:+也可以工作嗎? – tokland 2011-02-15 12:37:41