【问题标题】:Nil can't be coerced into FixnumNil 不能被强制转换为 Fixnum
【发布时间】:2012-10-31 19:41:39
【问题描述】:

我有以下功能:

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

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

【问题讨论】:

    标签: ruby ruby-1.9 fixnum


    【解决方案1】:

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

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

    return false unless digits.length == 16
    

    【讨论】:

    • 啊,有道理!我该如何解决这个问题?
    • 如果数字不等于 16 则返回 false 的问题意味着并非所有信用卡都会通过 Luhn 算法(这是上面的函数应该做的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多