2017-12-18 1211 views
-2

我想與功能的陣列來概括的數字:如何總結數字陣列中的

def total(numbers) 
numbers.each do |e| 
    total_number = e + total_number 
    return total_number 
end 
end 

puts total([1,2,3,4]) 

但我不斷收到錯誤消息說:

零不能被強制到Fixnum(repl):18:在'+'

任何人都可以看到我做錯了什麼?

each> do循環在函數外部工作。

+2

'total_number'最初是'nil',所以你有'total_number = e + nil'。你可能想在循環之後返回,而不是在循環之內。 – Stefan

回答

5

您還沒有初始化total_number變量,所以它給這個錯誤,試試這個

def total(numbers) 
total_number = 0 
numbers.each do |e| 
    total_number += e # Same as your total_number = e + total_number 
end 
return total_number 
end 

puts total([1,2,3,4]) 

但是,最好的辦法是使用紅寶石內置數組的方法。

array = [1, 2, 3, 4] 
total_number = array.inject(:+) 
+1

另一件事最初是錯誤的,但是在這個答案中已經修復了return語句的位置。它在循環中,所以函數在第一次迭代中返回,只產生數組的第一個數字。 –

+3

'return'在這裏不需要 –

+0

這會解決這個問題,雖然我會說@AlexGolubenko有這樣做的正確方法。沒有必要重新發明輪子,無論這個方法可能微不足道。 – SRack

5

有許多不同的方式來做到這一點:

numbers.sum 

numbers.inject(:+) 

等等。不要害羞檢查docs下一次;)

+0

@Stefan當然,我在編輯的時候已經晚了,而我正在考慮重構方法的一個可能的變體) –

+0

也許你可以展示如何用'external'來重構OP的方法,用外部計數器來'用'注入''來注入' '只需':+'到'sum'。 – Stefan