-2

機能するものは次のとおりです。

def sum
  result = 0
  self.each { |num| result += num }
  result
end

なぜこれが機能しないのですか?

def sum(*numbers)
  result = 0
  numbers.each { |num| result += num }
  result
end

テスト: [4,6,9] を渡すと、合計が得られます。上の関数は機能しますが、下の関数はそれらを追加しません。

いじってみるとself.、テストをパスし続けるために必要ではないことがわかりました。形がいいだけ?

4

4 に答える 4

0
  def sum(*numbers)
    result = 0
    numbers.each { |num| result += num }
    result
  end
  p sum(1,2,3)

また

class Array
def sum
    result = 0
    self.each { |num| result += num }
    result
end
end
p ([1,2,3].sum)

出力:

6

以下は行わないでください。

  def sum(*numbers)
    p numbers
    result = 0
    numbers.each { |num| result += num }
    result
  end
  p sum([1,2,3])

出力:

[[1, 2, 3]]
true.rb:255:in `+': Array can't be coerced into Fixnum (TypeError)
    from true.rb:255:in `block in sum'
    from true.rb:255:in `each'
    from true.rb:255:in `sum'
    from true.rb:258:in `<main>'
于 2013-04-06T13:28:45.577 に答える
0

このnumbers引数は、このメソッドに渡されるすべての引数を配列として受け取ります。

しかし、1 つの引数 (配列) を渡すと、ネストされた配列が得られます。

この状況を修正するには、 flatten メソッドを使用して、ネストされた配列をフラット配列に変換します。

def sum(*numbers)
  result = 0
  numbers.flatten.each { |num| result += num }
  result
end
于 2013-04-06T13:33:57.743 に答える
0

または、これを試すことができます:

def sum(*numbers)
  numbers.flatten.reduce(:+)
end

sum(1,2,3)このようにして、またはとして呼び出すことができますsum([1,2,3])

于 2013-04-06T18:40:34.727 に答える