我正在尝试编写将采用数组并返回数组的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
答案 0 :(得分:1)
您的inject
阻止是正确的。您的参数错误的产生是因为您将方法定义为采用单个参数,但在您的示例中,您使用四个参数调用它。如果要使用可变数量的参数,可以使用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有第三种形式,它只是使用数组的第一个成员作为初始值,并将其他成员加到其上:
nums.inject(:+)