2017-12-18 10 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]) 

しかし、私はというエラーメッセージが出続ける:

nilをすることができませんFixnum(repl)に強制される:18:+ '

私が間違っていることを誰でも見ることができますか?

each> doループは、関数の外部で動作します。

+2

'total_number'は最初は' nil'ですので、 'total_number = e + nil'となります。そして、おそらくあなたはループの後で、ループの後に戻りたいと思うでしょう。 – Stefan

答えて

5

、この

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次の時間を確認して恥ずかしがらないでください。)あなたはtotal_number変数を初期化していないので、それはそのエラーを与えている

+0

@Stefan確かに、私はメソッドリファクタリングの可能な変形について考えている間に編集に遅れました) –

+0

OPのメソッドを 'each'から' inject'のブロックを 'inject'の外部カウンタでリファクタリングする方法を示すことができます'だけで':+ 'を' sum'に変換します。 – Stefan

関連する問題