Ruby错误:无法将数组强制转换为Fixnum

时间:2016-08-31 11:55:08

标签: ruby

我目前正在研究一种简单的乘法方法。

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)

),该方法可以正常工作

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中一样,通常有一种方法可以完成你想做的事情。在这种情况下,injectreduce可以实现您的目标。

def multiply(*numbers)
    numbers.flatten.reduce(&:*)
end

答案 3 :(得分:-1)

没关系!我意识到当使用* args传递数组时,它变成了数组数组。