0

配列を取り、配列の SUM を返すコードを作成しようとしています。まず、これは数値を配列に配置する正しい方法ですか? エラーに基づいて、それに問題がある可能性があるようです。

    def total(num)
       x = []
       x << num
       puts x.inject(0){|a,b|a+b}

    end

ここにはいくつかの問題があるようです。まず、次のメソッドを呼び出すと、このエラーが発生しますsum([3,2,41,2])

`total': wrong number of arguments (5 for 1) (ArgumentError) from calculator.rb:11

エラーが発生したことも思い出します:cant't covert fixnum into array

4

1 に答える 1

1

あなたのinjectブロックは正しいです。単一の引数を取るようにメソッドを定義したために引数エラーが発生しますが、この例では、4つの引数を使用してメソッドを呼び出します。可変数の引数を使用する場合は、さまざまなことを行うsplat演算子を使用できます。*この場合、未定義のすべての引数が配列に収集されます。

def total(*nums)
  nums.inject(0) {|a,b| a + b }
end

total(3,2,41,2) #=> 48

次の記号を使用すると、これをさらに単純化できますinject

nums.inject(0, :+) #=> 48

これは、配列の各メンバーを引数として使用して、シンボルで示されるメソッドをアキュムレータに送信することで機能します(ブロックをとして定義するのと同じ{|a, b| a.send(:+, b) }です)。

実際、この場合、初期値を定義する必要はありません。Injectには、配列の最初のメンバーを初期値として使用し、他のメンバーを合計する3番目の形式があります。

nums.inject(:+)
于 2013-02-09T00:30:41.210 に答える