我目前正在研究一种简单的乘法方法。
CODE:
def multiply(*numbers)
product = 1
numbers.each{|number|
product *= number
}
return product
end
puts multiply([2, 3, 4, 5])
输出:
*': Array can't be coerced into Fixnum (TypeError)
from calculator.rb:26:in
阻止乘法'
来自calculator.rb:24:in each'
from calculator.rb:24:in
乘以'
来自calculator.rb:31:在`'
我收到此错误。似乎这种方法不允许我使用" .each"在阵列上。
另外,我希望将参数保留为*数字,以防它不是数组而是两个数相乘。我要提请你注意,当传递的参数是两个数而不是一个数组时(即乘法(2,4)
),该方法可以正常工作答案 0 :(得分:1)
multiply
需要任意数量的参数。您只传递一个参数,即一个数组。在第一次迭代中,number
是整个数组。因此错误信息。
你必须修理电话,
multiply(*[2, 3, 4, 5])
或更简单,
multiply(2, 3, 4, 5)
答案 1 :(得分:0)
问题不同。在numbers.each
中,您遍历参数列表,但是使用multiply([2, 3, 4, 5])
传递一个参数,即一个数组。参数列表为[[2, 3, 4, 5]]
。因此,在唯一的迭代中,您正在尝试:
1 *= [2, 3, 4, 5]
这基本上对Ruby没有意义,所以它会抛出一个错误。
您应该使用参数列表调用multiply
方法,而不是使用数组参数:
乘以(2,3,4,5)
然后它会起作用。
答案 2 :(得分:0)
如果您希望能够将数组用作输入,则可以使用flatten
数组上的numbers
方法。
def multiply(*numbers)
product = 1
numbers.flatten.each{|number|
product *= number
}
return product
end
puts multiply([2, 3, 4, 5]) #=> 120
flatten方法将采用2d数组并转换为简单数组。
这也可行
multiply([2, 3, 4, 5], 2, 2) #=> 480
在这种情况下,
numbers = [[2, 3, 4, 5], 2, 2]
应用展平方法后,您将获得
[2, 3, 4, 5, 2, 2]
然后你可以开始乘以每个数字。
正如在Ruby中一样,通常有一种方法可以完成你想做的事情。在这种情况下,inject
和reduce
可以实现您的目标。
def multiply(*numbers)
numbers.flatten.reduce(&:*)
end
答案 3 :(得分:-1)
没关系!我意识到当使用* args传递数组时,它变成了数组数组。