Nil无法强制进入Fixnum

时间:2012-10-31 19:41:40

标签: ruby ruby-1.9 fixnum

我有以下功能:

def valid_credit_card?(number)
    digits = number.scan(/./).map(&:to_i)
    check = digits.pop

    sum = digits.reverse.each_slice(2).map do |x, y|
        [(x * 2).divmod(10), y]
    end.flatten.inject(:+)

    (10 - sum % 10) == check
end

但由于某种原因,我不断收到以下错误消息: nil can't be coerced into Fixnum

由于某种原因,我无法弄清楚为什么会抛出错误。有什么想法可能会发生这种情况吗?

1 个答案:

答案 0 :(得分:2)

digits具有奇数个元素时,您的方法失败。在这种情况下,当您在上次迭代时调用each_slice(2)时,x将是digits的最后一个元素,y将是nil。因此,当您进入inject(:+)阶段时,数组的最后一个元素是nil,当解释器遇到类似2 + nil的内容时,就会发生强制错误。

为什么不对输入的位数添加初始检查?类似的东西:

return false unless digits.length == 16