2012-10-31 28 views
0

我有以下功能:无不能强迫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

出于某种原因,我不能弄清楚为什么错误被抛出。任何想法,为什么这可能会发生?

回答

2

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

为什么不添加初始检查输入的位数?例如:

return false unless digits.length == 16 
+0

啊,这很有道理!我将如何去解决这个问题? – dennismonsewicz

+0

如果数字不等于16,则返回false的问题意味着并非所有信用卡都将通过Luhn算法(这是上述功能应该执行的操作) – dennismonsewicz

+0

我解决了这个问题:https:// github.com/joeljunstrom/ruby_luhn – dennismonsewicz

相关问题