-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

numbers参数将所有传递给此方法的参数作为一个数组。

但是然后你传递了一个参数 - 数组,所以你有一个嵌套数组。

要解决这种情况,您可以使用 flatten 方法将嵌套数组转换为平面数组。

def sum(*numbers)
  result = 0
  numbers.flatten.each { |num| result += num }
  result
end
于 2013-04-06T13:33:57.743 回答
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

问题

当您使用 splat 收集参数时,您正在将它们收集到一个数组中。如果将数组传递给 splat,您将得到一个嵌套数组。例如:

def sum(*numbers)
  numbers.inspect
end
#=> [[4, 6, 9]]

在这种情况下,Array#each[4, 6, 9]作为其唯一成员返回。

解决方案

如果你知道你要传入一个数组,你可以使用Enumerable#reduce代替。例如:

def sum array
  array.reduce :+
end

sum [4, 6, 9]
#=> 19
于 2013-04-06T17:10:27.610 回答
0

或者你可以试试这个:

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

这样你就可以调用它作为sum(1,2,3)sum([1,2,3])

于 2013-04-06T18:40:34.727 回答