2014-01-13 31 views
1

試圖總結數組中的所有數字。 例10 + 20 + 30應該是60按索引訪問數組的值時出錯?

def sum *arr 
    i=0 
    total=0 
    while i <= arr.count 
    total += arr[i] 
    i+=1 
    end 
    total 
end 

puts sum(10,20,30) 

爲什麼會出現這種錯誤。這段代碼看起來應該適用於我。我究竟做錯了什麼?爲什麼不讓它通過索引訪問數組值?

p8.rb:23:in `+': nil can't be coerced into Fixnum (TypeError) 
     from p8.rb:23:in `sum' 
     from p8.rb:29:in `<main>' 
+1

保存自己的麻煩,並瞭解如何'arr.inject(:+)'作品。 –

+0

或者只是用戶'''arr.sum'''如果你在軌道上 –

+0

謝謝,我用'inject'和'reduce'之類的,但是我仍然在努力去理解爲什麼上面的代碼返回一個錯誤。這是Ruby內部的東西嗎? – fyz

回答

7

變化

while i <= arr.count 

while i < arr.count 

arr[arr.count]總是出界。


據透露寫sum較短的方法是:

def sum *arr 
    arr.inject(:+) 
end 
+0

要進一步說明:長度爲N的數組的元素編號從0到N-1。例如,在一個10個元素的數組中,元素爲0,1,2,3,4,5,6,7,8和9.沒有元素編號爲10.(如果編號以1而不是0)。 –

+0

這到底是怎麼回事?我可以發誓我也試過。現在我正在努力理解它是如何「超出範圍」 – fyz

+0

@feed_me_code在你的例子中,'i'的有效值是'0,1,2'。 'arr.count'是3. – Matt

1

馬特的答案給你經典紅寶石的方式來總結,採用注入。但是如果你還沒有準備好學習注入,至少應該省去手動記錄數組索引(你的實際問題在哪裏!)的麻煩,通過使用#each遍歷數組像這樣:

def sum *arr 
    total = 0 
    arr.each do |x| 
    total += x 
    end 
    total 
end 

puts sum(10,20,30) # => 60 
0

馬特的答案既光滑又正確,但因爲ruby零索引數組而導致錯誤。所以,如果你改變了計數條件 while i <= arr.count - 1

你的錯誤會消失