2016-03-10 91 views
0

嘗試一個簡單的教程對紅寶石。在IRB中,當i型如下代碼Ruby注入方法奇怪的輸出

(1..10).inject{|memo,n| memo + n} 
=>55 (correct calculation) 

然而,當我鍵入以下內容:

(1..10).inject{|memo,n| memo + n*2} 
=>109 (which should be 110) 

計算變得錯誤。當Ruby執行注入方法時,似乎有什麼問題?

+0

這是沒有錯的。你在什麼意義上聲稱它是錯的?問題不明確。 – sawa

+0

@sawa我認爲這是錯誤的,因爲在第一個代碼中,它是這樣做的: 備註= 0 備註+ = 1 備忘錄+ = 2 。 。 備忘錄+ = 10。 對於第二個代碼,一切應該是時間2. – Sydney

回答

2

而不是依靠紅寶石魔力,即通過第一枚舉元素memo時,沒有明確指定,我總是有明確的備忘錄初始化走:

#    ⇓⇓⇓ initial memo value 
(1..10).inject(0) { |memo,n| memo + n*2 } 
#⇒ 110 
+0

我不知道備忘錄將採取該範圍的第一項的值。我認爲這將從一個空容器開始。 – Sydney

+0

「空」很難預測。考慮'注入&:+'和'注入&:*'。另外,'0'是最好的選擇。對於乘法,'1'是。 – mudasobwa

1

這是因爲在第一次assignes 1至備忘錄和2到n:

|memo, n| => memo = 1, n = 2 

所以,當你在第一次簡單的ADD,將以1 + 2 = 3,則n經過休息數字。因此,n永遠不會成爲第一個數字。