我有以下功能:
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
由于某种原因,我无法弄清楚为什么会抛出错误。有什么想法可能会发生这种情况吗?
答案 0 :(得分:2)
当digits
具有奇数个元素时,您的方法失败。在这种情况下,当您在上次迭代时调用each_slice(2)
时,x
将是digits
的最后一个元素,y
将是nil
。因此,当您进入inject(:+)
阶段时,数组的最后一个元素是nil
,当解释器遇到类似2 + nil
的内容时,就会发生强制错误。
为什么不对输入的位数添加初始检查?类似的东西:
return false unless digits.length == 16